pwnable/FTZ

Stack Frame debugging

라부송 2019. 10. 2. 21:50

structure.c

다음과 같이 코드를 짜준다.

 

 

컴파일 한 후 gdb로 디버깅을 시작한다.

 

 

disass main

 

disass function

 

위 디스어셈블 결과로 스택 프레임의 구성을 분석해본다.

 

명령어 내용 스택
push ebp 베이스 포인터 입력 (입력 전 먼저 프로그램 호출 전의 스택 구조의 주소를 스택에 저장 - RET)
시작 - ebp는 블럭 아래, esp는 블럭 위
mov ebp, esp 베이스 포인터를 스택 포인터 주소로 이동 (해당 명령 시 저장하는 포인터 - SFP)
sub esp, 0x8

esp = esp -  0x8

함수에서 사용할 변수 공간 확보 (8바이트 만큼 비움)

and esp,0xfffffff0

mov eax,0x0 
sub esp,eax

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)
esp 위치는 임의로 설정한 것임
 
leave

mov esp, ebp

pop ebp

ret

pop eip

jmp eip

add esp, 0x10

mov eax, 0x0

esp = esp + 0x10(16byte higher)

eax를 0으로 만들어줌