Self-Improvement

Protostar-stack0 풀이 본문

리버싱 기초

Protostar-stack0 풀이

JoGeun 2018. 12. 19. 15:05

먼저 풀어야할 stack0의 소스코드이며 리눅스에서 작성을 해준다.


stack0.c을 컴파일 하기위해 gcc을 이용하지만 기본적으로 컴파일할 시엔 stackoverflow?가 막히기 때문에 아래의 옵션을 추가하여 컴파일을 진행한다.

gcc -z execstack -no-pie -w -o stack0 stack0.c


컴파일 되어진 stack0을 gdb-multiarch로 디버깅을 시작한다.


이때 설정하는 것은 개인에 따라 다르겠지만 필자는 big 엔디안과 intel 형식으로 셋팅하였다.


먼저 disass main 명령어로 메인의 디스어셈블을 확인한다.

확인해보니 test(main+42)에서 modified의 값이 0인지 아닌지를 비교하는 구문으로 확인된다.


먼저 test 명령어가 있는 위치에 브레이크 포인트를 설정한다.

b *main+42


다음 실행을 해주면서 인자값으론 A을 대략 20개?를 입력해보았더니 브레이크 포인트 설정해놓은 곳에서 멈추면서 레지스터 값과 스택 등의 정보를 보여주고 있다. 그리고 test에서 사용되는 eax 레지스터의 값을 확인해보니 0으로 그대로 셋팅되어 있었으며 continue로 실행하면 "try again"이 출력되면서 실패하게 된다.


다시 run을 해주면서 이번엔 인자값으로 A을 80개를 설정해주었다. 


다시 한번 eax 레지스터를 확인해보니 A로 덮혀져 있는 것을 확인할 수 있다.


test 명령어 위의 mov에서 사용되는 rbp의 레지스터 값을 확인해보니 0x7ffffffe190으로 되어있었다.


x/30gx $rsp로 스택을 확인해보니 mov에서 사용되는 rbp-0x4의 위치는 modified의 변수로 41로 차있는 것을 확인할 수 있다.


continue로 실행하게 되면 성공적으로 풀이가 되었다.



'리버싱 기초' 카테고리의 다른 글

[MOV] VS [LEA] 차이점  (0) 2020.04.28
Protostar-stack1 풀이  (0) 2018.12.19
PE 구조 (섹션 헤더)  (0) 2018.11.11
PE 구조 (NT Header)  (0) 2018.11.11
PE 구조 (DOS Stub)  (0) 2018.11.11