pwnable/FTZ
Stack Frame debugging
라부송
2019. 10. 2. 21:50
다음과 같이 코드를 짜준다.
컴파일 한 후 gdb로 디버깅을 시작한다.
위 디스어셈블 결과로 스택 프레임의 구성을 분석해본다.
명령어 | 내용 | 스택 |
push ebp | 베이스 포인터 입력 (입력 전 먼저 프로그램 호출 전의 스택 구조의 주소를 스택에 저장 - RET) | ![]() |
mov ebp, esp | 베이스 포인터를 스택 포인터 주소로 이동 (해당 명령 시 저장하는 포인터 - SFP) | ![]() |
sub esp, 0x8 |
esp = esp - 0x8 함수에서 사용할 변수 공간 확보 (8바이트 만큼 비움) |
![]() |
and esp,0xfffffff0 mov eax,0x0 sub esp,0x4 push 0x3 |
esp가 0ffffff0인지 비교 후 0x0을 eax(산술연산레지스터)에 저장 esp = esp - eax(0x0) esp = esp - 0x4 (1칸 lower) 0x00000003 값을 스택에 push |
![]() |
push 0x2 push 0x1 |
0x00000002, 0x00000001 값 차례로 스택에 push | ![]() |
call 0x80482f4 <function> |
0x80482f4에 위치한 function 함수를 불러옴 스택에는 main으로 복귀 시 시작 지점 주소를 push |
![]() |
push ebp |
베이스 포인터가 가리키고 있는 주소를 push (ebp값이 변하는게 아님) |
![]() |
mov ebp, esp | 베이스 포인터 주소를 스택 포인터 주소로 이동 | ![]() |
sub esp, 0x28 | esp = esp - 0x28 (lower) | ![]() |
leave |
mov esp, ebp pop ebp |
![]() |
ret |
pop eip jmp eip |
![]() |
add esp, 0x10 mov eax, 0x0 |
esp = esp + 0x10(16byte higher) eax를 0으로 만들어줌 |
![]() |