gdb disassemble
- 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 |
댓글