문제이다.
먼저, 문제에 있는 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 :(
'Pwnable > Pwnable CTF' 카테고리의 다른 글
[Pwnable.kr] Toddler's Bottle_input (0) | 2021.04.06 |
---|---|
[Pwnable.kr] Toddler's Bottle_random (0) | 2021.04.06 |
[Pwanable.kr] Toddler's Bottle_flag (0) | 2021.03.31 |
[Pwnable.kr] Toddler's Bottle_bof (0) | 2021.03.23 |
[Pwnable.kr] Toddler's Bottle_collision (0) | 2021.03.23 |