GDB로 코드 하나를 분석해보려고 한다.
이번에 분석해볼 코드는 아래와 같다.
main 함수 내에 functhion 함수가 있고, 매개변수를 넣어 functhion을 실행한다.
function 함수를 보면 char는 1바이트 씩이니까 buffer1은 15바이트, buffer2는 10바이트 크기를 가지고 있다.
소스파일 만들어주고 컴파일 시켜준다.
+)
32비트로 컴파일 시켜줘야해서 위와 같이 다시 컴파일 시켜주었다.
위의 fatal error은 위의 sudo apt-get ~ 명령어로 해결할 수 있었다.
gdb 실행시켜 준다.
gdb에서 함수 디스어셈블 시켜봤다. (pdisas 명령어는 disass랑 같은데 색깔이 들어간다.)
프로그램이 시작되면 eip 레지스터 위치는 main함수의 시작점이 된다.
(eip : 앞으로 수행할 명령어의 주소 위치를 담고 있음)
그래서 breakpoint를 맨 앞에 걸어주었다.
그리고 실행해보면 맨 처음에 걸리는 걸 볼 수 있다.
eip 정보 보면 프로그램 시작 맨 앞 주소가 나오는 것도 확인할 수 있다.
이 부분이 main 함수의 프롤로그 부분이고,
이 부분은 인자 값을 주기 위해 공간을 확보하는 부분이다.
그리고 바로 뒤 push로 인자 값을 준다.
스택 구조는 가장 나중에 들어간 것을 가장 먼저 꺼내기 때문에 1 2 3 순이 아닌 3 2 1 순으로 넣고 있는 것을 볼 수 있다.
인자 값을 넘겨주고 function을 call 하는 데 잠깐 function 함수에 들어갔다가 다시 main으로 돌아온다.
main으로 돌아올 때 어디로 돌아올 지 eip에다가 저 function 함수 옆에 있는 주소(return address가 돌아오는 부분)를 넣고 function 함수를 실행하게 된다.
function을 call 하기 바로 전 push에 breakpoint를 걸어주었다.
그래서 다음 줄 실행해보면 (ni/si : 한 줄씩 실행)
function을 실행하는 것을 볼 수 있다.
function 함수 시작 주소가 eip에 들어가 있는 것을 볼 수 있다.
function 함수를 보면
이 부분이 프롤로그 부분이다.
main 함수에서 사용하던 ebp를 다시 push로 저장하고, esp를 function 함수의 ebp로 만든다.
그 담엔 sub로 28 바이트만큼 확장한다.
아까 코드 보면 buffer1은 15 바이트, buffer2는 10바이트였는데 이 gcc 버전에서는 word 단위(4바이트)로 할당이 되기 때문에 4x4 =16, 4x3=12 해서 28바이트만큼 확장하는 것이다.
이 부분은 함수 에필로그 부분이다.
esp를 이전 ebp로 잡고 확장했던 스택 영역을 반환하고, pop으로 이전에 저장해 뒀던 main 함수의 ebp를 복원하고(leave) 리턴한다. (ret)
ret 이후 실행해보면 다시 이렇게 main 함수로 돌아간 것 확인 가능하다.
그 담줄인 add는 16바이트만큼 반환한다. - push 하기 이전으로 돌아감
그리고 main도 함수이기 때문에
이렇게 함수 에필로그 부분이 존재한다.
'Pwnable' 카테고리의 다른 글
[dreamhack] basic_exploitation_001 (0) | 2021.05.18 |
---|---|
[pwnable.kr] bof (0) | 2021.05.18 |
[Pwnable] GDB 사용방법 정리 (0) | 2021.05.11 |
[pwnable.kr] collision (0) | 2021.05.05 |
[pwnable] swing_pwn_chall (0) | 2021.04.28 |
댓글