본문 바로가기
Pwnable/Pwnable CTF

[Pwnable.kr] Toddler's Bottle_passcode

by Y06 2021. 3. 31.

문제이다.

먼저, 문제에 있는 passcode@pwnable.kr로 접속한다.

여기서 login() 함수를 보면 입력을 받는 부분이 존재한다.

 

이 둘은 입력값을 passcode1에 저장을 하는 것이 아니라, passcode1을 주소로 한 곳에 저장을 하게 된다.

 

두 변수 모두 초기화되지 않았기 때문에 더미값이 들어가 있을 것이고, 그 더미 값을 주소로 하는 곳에 입력 값을 저장하게 되는 코드라 오류가 나게 된다.

 

welcome 함수에서 가장 중요한 부분은 welcome+38~+48이다.

lea edx, edp-0x70으로 edx에 edp-0x70이라는 주소 값을 넣어주었고, 이 값이 mov 되면서 scanf 함수에 그대로 전달된다.

 

이를 통해서 우리는 edp-0x70이 name[100]의 시작주소라는 것을 유추 할 수 있다.

 

login 함수에서 우리가 주의깊게 봐야할 부분은 당연히 passcode1의 흐름이다.

우리가 사용할수있는 부분은 name[100]과 passcode1뿐이기 때문이다.

이제 passcode1의 시작주소를 찾아보고, 값을 어떻게 써야할지 찾아보자.

 

login함수에서의 첫번째 scanf문은 login+34 부분이다. 그리고 여기서 조금만 위로 가보면 login+24 부분에서 *(ebp-0x10)을 edx에 복사해주고, 이 값을 아래로 내려가면서 계속 사용하는 것을 볼 수 있다.

이부분에서 우리는 *(ebp-0x10)이 passcode1의 시작주소라는것을 유추할수있다.

 

정리해보면, name[100] = 0x70 부터 100byte / passcode = 0x10 부터 4byte를 입력받는다.

 

 

[dummy 96] + [ ??? 4]

- scanf와 scanf사이에 있는 fflush함수의 GOT를 ??? 에 입력

[dummy 96] + [ fflush@got 4]

- 두번째 scanf에서 system함수의 시작주소를 입력하면 위의 코드처럼 "/bin/cat flag" 가 실행

[dummy 96] + [ fflush@got 4] + [ &system 4] = 성공

 

첫 번째 부분이 fflush의 got이다.

 

[dummy 96] + [ 0x0804a004 ] + [ 0x080485e3] = 성공

 

공격을 시도한다.

 

flag: Sorry mom.. I got confused about scanf usage :(