Try Attack/System Hacking[basic]

gdb disassemble

D4tai1 2018. 5. 16.

 

- c 원본소스 -

 

 

- 실행파일 exe를 gdb로 main 함수를 disassemble 한 것 -

 

1) push ebp => 이전 함수의 기준주소를 stack에 저장

- ebp란? extended base pointer로 기준주소를 의미한다.

 

2) mov ebp, esp => 현재 stack의 top pointer를 기준주소로 저장 (main함수의 기준주소를 ebp에 저장)

- 모든 함수의 시작에는 1) 과 2)가 있다.

 

3) sub esp, 0x8 => stack memory의 공간을 8byte만큼 확보한다.

 

4) mov DWORD PTR [ebp-0x4], 0xa => 0xa(10진수 10)를 ebp-0x4 [3)에서 확보한 스택포인터]에  4byte정수를 넣는다. 

- DWORD PTR은 4byte 정수타입 주소를 말한다. 

 

5) mov DWORD PTR [ebp-0x8], 0x14 => 0x14(10진수 20)를 ebp-0x8 [3)에서 확보한 스택포인터]에 4byte정수를 넣는다.

- 3)에서 4byte정수 2개 저장할 공간인 8byte를 채웠다.

 

6) mov edx, DWORD PTR [ebp-0x4] => ebp-0x4에 저장한 10을 edx에 저장

 

7) mov eax, DWORD PTR [ebp-0x8] => ebp-0x8에 저장한 20을 eax에 저장

 

8) add eax, edx => eax += edx

 

9) push eax => stack memory에 eax 저장

- printf함수에 있는 인자를 뒤에서부터 stack에 저장한다. [stack = LIFO]

 

10) push 0x80484c0 => (gdb) x/s 0x80484c0  해보면  c언어에서 적은 "value %d \n" 가 있는 것을 알 수 있다.

 

11) call 0x80482e0 <printf@plt> => printf 함수가 있는 곳으로 이동(아래는 상세설명)

- call의 구조 (push eip, jmp [함수위치(0x80482e0)])

=> 다음 실행할 명령어의 주소를 push하고 print함수의 위치로 이동

 

+printf 함수 내부에는 또 다시

push ebp

mov ebp, esp

 

pop ebp

mov esp, ebp

ret

 

 

12) add esp, 0x8 => 3)에서 메모리 사용한 것을 다시 복원시켜준다.

 

13) mov eax, 0x0 => main함수에 0을 반환하여 종료하기 위해 0 저장

 

(14) leave => (1)과 (2) 에서 stack에 넣고 ebp를 main함수의 기준주소로 저장했는데 메인함수가 종료되고 이동할 기준주소로 돌려준다.

- leave의 구조(mov esp, ebp / pop ebp)

 

(15) ret => eax에 있는 값을 반환

- ret의 구조(pop eip, jmp eip) => eip(extended instruction pointer)는 다음 실행할 명령어의 주소를 저장하는 명령포인터, 즉 다음 실행할 곳을 꺼내서 이동한다.

- SFP(Stack Frame Point)

 

'Try Attack > System Hacking[basic]' 카테고리의 다른 글

gcc 사용방법  (0) 2018.05.18
함수의 호출규약  (1) 2018.05.18
gdb debugging  (0) 2018.05.17
gdbgui install  (0) 2018.05.17
gdb 표기문법  (0) 2018.05.16

댓글