어셈블리의 명령 포맷

명령어 + 인자

명령어 + 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

 

+ Recent posts