1. strstr 어셈블리 구현 [strcmp 순서도] [strcmp 어셈블리 소스] 실행 결과 2.1 strstr동적 디버깅 분석 1 [strcmp 디버깅] Hello world! 문자열의 첫 번째 ‘H’ 와 입력 값 ‘A’ 와 비교하면 아스키 코드 숫자로 변환하여 72,65가 된다. 그림과 같이 72가 큰 값으로 L_B로 점프하는 것을 확인하였다. 2.2 strstr동적 디버깅 분석 2 [strcmp 디버깅] 같은 문자열일 때 00까지 확인 후 종료되는 것을 확인할 수 있다. 문자열 길이가 다를 경우 길이가 더 긴 쪽이 큰 값으로 반환된다.
1. strcmp 어셈블리 구현 [strcmp 순서도] [strcmp 어셈블리 소스] 실행 결과 2.1 strcmp 동적 디버깅 분석 1 [strcmp 디버깅] Hello world! 문자열의 첫 번째 ‘H’ 와 입력 값 ‘A’ 와 비교하면 아스키 코드 숫자로 변환하여 72,65가 된다. 그림과 같이 72가 큰 값으로 L_B로 점프하는 것을 확인하였다. 2.2 strcmp 동적 디버깅 분석 2 [strcmp 디버깅] 같은 문자열일 때 00까지 확인 후 종료되는 것을 확인할 수 있다. 문자열 길이가 다를 경우 길이가 더 긴 쪽이 큰 값으로 반환된다.
1. strcpy 어셈블리 구현 [strcpy 순서도] [strcpy 어셈블리 소스] ECX에 원본 문자열의 크기 값이 대입되어 REP MOVS 명령어가 ECX 크기만큼 반복 실행된다. strcpy함수와 같은 위 어셈블리 코드를 실행하면 Null로 초기화 되어 있던 destStr 배열안에 srcStr 문자열을 복사하여 넣을 수 있다. 배열 크기가 넉넉하기 때문에 문제점을 찾을 수 없지만 원본 크기가 사본 배열크기보다 클 경우 buffer overflow 취약점이 생길 수 있다. 사본 배열의 공간크기를 검증하지 않고 수행되기 때문에 크기에 관계없이 반복하여 메모리에 값을 넣어버린다. 2.1 strcpy 동적 디버깅 분석 1 [strcpy 디버깅] 그림과 같이 ECX 에 0x0000000C (12) 값이 들..
1. strcat 어셈블리 구현 [strcat 순서도] [strcat 어셈블리 소스] Strlen 함수를 이용하여 destStr, srcStr 문자열의 길이를 구한다.[destStr 문자열의 시작주소] +[문자열의 길이] = [destrStr 마지막 주소] 를 구한 뒤 끝부분부터 strStr 문자열을 처음 값부터 차례대로 넣어주어 최종적으로 destStr문자열에 더해질 수 있다. ECX값에 srcStr 문자열의 길이 값을 넣어주면 REP MOVS 명령어가 반복될 때마다 ECX는 자동으로 1씩 감소한다. 이 반복이 끝날 경우는 ECX가 0이 될 때까지 반복하기 때문에 정확히 srcStr문자길이만큼 반복하여 destStr문자열에 붙여 넣을 수 있게 된다. 2.1 strcat 동적 디버깅 분석 1 [strca..
[어셈블리어] CMP 명령어 종류 CMPoperand 를 비교(묵시적 마이너스 연산)첫번째 operand 에서 두번째 operand 값을 뺀다.결과 = 상태레지스터operand에 영향 없음. CMP reg, reg ex) CMP EAX, EBX CMP mem, reg ex) CMP [EBP-0x04], EAX CMP reg, mem ex) CMP EAX, [EBP-0x04] CMP reg, imm ex) CMP EAX , 0x02 CMP mem, imm ex) [EBP-0x04], 0x05 CMP 연산 결과 ZF(Zero Flag) CF (Carry Flag) dest sourcea > b 0 0 dest == sourcea == b 1 0 a가 b 보다 작다..
어셈블리어 명령어(Opcode) INCoperand 값이 1 증가 INC reg ex) INC EAX INC mem ex) INC [EBP-0x04] DECoperand 값이 1 감소 DEC reg ex) DEC EAX DEC mem ex) DEC [EBP-0x04] ADD(a+=b 와 동일)두 operand 값을 더해첫번째 operand 값에 저장.-첫번째 operand 에 상수가 올 수 없음 ADD reg, reg ex) ADD EAX, EBX ADD mem, reg ex) ADD [EBP-0x04] EAX ADD reg, mem ex) ADD EBX, [EBP-0x08] ADD reg, imm ex) add ECX, 0x05 ADD mem, imm ex) ADD [EBP-0x04], 0x04 SUB..
어셈블리 언어 명령어와 Operand 표시기호설명 mem메모리 label지정된 레이블 imm즉시 값(상수) reg 범용 레지스터 label = JMP 사용시 위치값 필요.INC = 인크리먼트 ( Operand 값을 1만큼 증가 ) [] 대괄호는 C언어에서 역참조(*)와 같은 역할.C언어에서 PTR을 안써주면 컴파일할때 1byte만 읽는다.ex) DWORD PTR[EBP-4] : EBP-4 부터 DWORD만큼 역참조해서 읽겠다. 인라인어셈상위레벨언어에서(C언어) 어셈블리언어를 사용할때 사용.상위레벨언어의 변수를 사용 가능하다.ex) int main(){ int a=0; _asm { INC a INC a } //
레지스터란? 레지스터 : CPU 내부에 있는 저장공간 *프로그램 실행 과정1.보조기억장치인 하드디스크에 실행파일 보관2.주기억장치인 RAM에 실행파일을 복사함.3. RAM에 데이터를 중앙처리장치인 CPU 레지스터를 이용하여 복사해와서 처리. 32bit General-purpose Resgisters(32bit 범용 레지스터)이름 명칭 해당 레지스터만의 기능 EAX 누산기 함수의 리턴값을 저장 (EDX와 같이쓸땐 하위 4byte) EBX 간접주소 지정자 간접 주소 지정. ECX 반복카운터 0과 같을때까지 하나씩 감소시키면서 반복한다.ECX값이 감소하면서 0이 될때까지 반복함.0 < ECX 0 < 3 0 < 20 < 10 < 0 EDX EAX 보조 4byte 이상의 값을 EAX와 나눠서 해결.(상위4byte..