어셈블리의 명령 포맷
명령어 + 인자명령어 + destination, source (Intel 문법에서)
레지스터
레지스터는 CPU가 사용하는 변수라고 생각하자!
EAX : accumulator, 리턴값 저장
EDX : 각종 연산에 사용됨. 특히 곰셈, 나눗셈
ECX : count, 루프문에서 주로 사용됨.
EBX : 컴파일러가 필요할 때 적당히 사용함.
ESI, EDI : Source Index & Destination Index, 메모리를 복사할 때 주로 사용함.
32비트 |
16비트 |
상위 8비트 |
하위 8비트 |
EAX |
AX |
AH |
AL |
EDX |
DX |
DH |
DL |
ECX |
CX |
CH |
CL |
EBX |
BX |
BH |
BL |
어셈블리 명령어
PUSH, POP : 스택에 값을 넣거나 스택에 있는 값을 가져오는 명령어
MOV : dest에 src의 값을 넣어주는 명령어
LEA : MOV와 비슷하나 값이 아닌 주소를 가져오는 명령어
ADD : dest에 src의 값을 더해주는 명령어
SUB : dest에 src의 값을 빼주는 명령어
INT : interrupt를 일으키는 명령어
CALL : 함수를 호출하는 명령어
INC, DEC : 1을 더해주거나 빼주는 명령어
AND, OR, XOR : dest와 src의 and, or, 또는 xor 연산을 행해주는 명령어
XOR eax, eax 는 eax를 0으로 만들어준다.
NOP : 아무것도 행하지 않는 명령어, 해킹이나 리버스 엔지니어링에서 많이 쓰인다.
CMP, JMP : 비교해서 점프하는 명령어, JMP에는 여러 종류가 있다.
함수의 호출과 스택
call 0xdeadbeef
를 실행하는 것은 다음과 같이 변환된다.
push eip
jmp 0xdeadbeef
함수의 시작에서는,
push ebp
mov ebp, esp
sub esp, 50h
함수가 끝날때 leave; ret;
을 실행하는 것은 다음과 같다.
mov esp, ebp
pop ebp
pop eip
jmp eip
함수의 파라미터들은 함수 호출 전에 스택에 쌓는다.
push arg_3
push arg_2
push arg_1
call xxxx
'리버스 엔지니어링 바이블' 카테고리의 다른 글
04 DLL 분석 (0) | 2018.10.17 |
---|---|
03 C++ 클래스와 리버스 엔지니어링 (0) | 2018.10.14 |
02 C 문법과 디스어셈블링 (0) | 2018.10.14 |
[리버스 엔지니어링 바이블] 책 소개 (0) | 2018.10.14 |
함수의 호출 규약 (0) | 2018.09.28 |