Study Record

[리버싱] 어셈블리어 문법 본문

리버싱/기본

[리버싱] 어셈블리어 문법

초코초코초코 2021. 11. 12. 14:38
728x90

→ AT&T 문법 : "명령어 [source] [dest]"

→ intel 문법   : "명령어 [dest] [source]"

 

※ 참고 사항

CF, ZF, SF, OF는 각각 1바이트로 전부 4바이트의 크기를 차지하는 레지스터이다.

CF : Carry Flag : 연산시 Carry가 발생하면 1로 세팅된다. 오버플로우를 탐지하는데 쓰이기도 한다.

ZF : 가장 최근에 계산된 명령어의 결과값이 0이면 1로 세팅된다.

SF : 가장 최근에 계산된 명령어의 결과값이 음수면 1로 세팅된다.

OF : 가장 최근에 계산된 명령어가 2's complement 오버플로우를 일으키면 1로 세팅된다.

 

xor %eax, %eax

각 비트가 서로 다른 값일 때만 결과가 1이 되고 같은 값이라면 결과는 0이 된다.(mod 2)

→ 레지스터를 0으로 초기화하는 방법 중 하나이다.

 

sub    $0x8, %esp

esp 레지스터 가리키는 주소에서 0x8만큼 주소를 뺀다. (esp = esp - 0x8)

 

add    $0x10, %esp

%esp 값에 $0x10(십진수:16) 만큼 더한다.

 

and    $0xfffffff0, %esp

%esp 스택의 내용과 $0xfffffff0 값을 bit AND 연산을 한다.

%esp 값의 마지막 4bit 부분의 값을 0로 만든다.

 

mov   %esp, %ebp

현재 esp 값을 ebp 레지스터에 저장한다.

 

lea    0xfffffffc(%ebp), %eax      -> Intel : lea $eax, [ebp - 4] 

exa 레지스터에 [ebp - 4] 주소값을 저장한다.

 

※ mov vs lea

ebp 레지스터 값이 0x0010이고 0x0014 위치에 값 30이 저장되어 있다면,
mov eax, [ebp+4] 명령을 통해 eax 레지스터엔 값 30이 저장되고
lea eax, [ebp+4] 명령을 통해 eax 레지스터엔 0x0014가 저장된다.

 

cmpl   %ebx, %eax

우선 두 개의 파라미터를 뺀다. (%eax - %ebx) 여기서 중요한 점이 있다. 뺄셈을 진행했을 때 그 값을 저장하지 않고 CF, ZF, SF, OF 레지스터 값들을 설정한다.

- Carry가 있는가? 있으면 CF를 1로 세팅

- 뺄셈한 값이 0인가? 0이면 ZF를 1로 세팅 (같을 경우)

- 뺄셈한 값이 음수인가? 음수면 SF를 1로 세팅

- 오버플로우가 발생헀는가? 발생했으면 OF를 1로 세팅

 

test %eax, %eax

첫번째 인자와 두번째 인자를 AND 연산시켜 ZF 를 설정한다. %eax 값이 0이면 ZF == 1 로 셋팅된다.  

 

jns 0x8048484

single Flag(SF == 0)가 해제되었으면 분기(양수면 분기)한다.

 

jne 0x8048484

jump not equal 로 ZF플래그가 0 일때 점프 한다. 즉 같지 않을때 점프한다.

 

je 0x804864d

ZF플래그가 1 이면 점프한다.

 

출처: https://operatingsystems.tistory.com/entry/SP-Conditional-Jump [Maybe]

 

 

 

728x90