Pwnable.kr
# [Toddler’s Bottle] passcode
passcode.c 파일을 열면 아래와 같이 main(), login(), welcome() 함수를 볼 수 있다.
이 때, login() 를 보면 scanf()를 할 때 passcode1과 passcode2의 주소가 아닌 값을 전달하는 것을 볼 수 있다.
따라서 Segmentation Fault가 발생할 것으로 예상된다.
이 때, welcome()을 호출한 뒤 login()을 호출하는 것을 알 수 있다.
따라서 welcome에서 name을 A 100개로 채워보았다.
그 뒤, login()을 호출하였을 때, welcome()에서 스택에 저장한 값이 남아있는 것을 볼 수 있다.
passcode1에 해당하는 ebx-0x10의 값을 보면 0x41414141이다. 이 점을 이용하여 입력하는 값을 저장할 주소를 적당히 적어주면 될 것으로 보인다.
하지만 passcode2의 경우 A를 최대 개수만큼 입력하였음에도 불구하고 값을 덮어 쓸 수 없다. 따라서 두 변수에 원하는 값을 모두 입력하는 것은 어렵다.
이 때, 위의 코드를 다시 보면 fflush()를 호출하는 것을 볼 수 있다.
따라서 fflush()의 GOT를 system(“/bin/cat flag”)의 주소로 overwrite해서 풀 수 있다.
먼저 fflush()의 주소인 0x08048430을 보면 got.plt인 0x0804a004로 jump하는 것을 볼 수 있다.
이 때 0x0804a004에 담긴 값인 0x08048436이 plt+6인 것을 보면 0x0804a004가 GOT임을 알 수 있다.
따라서 0x0804a004에 0x080485e3을 넣어주면 된다.
이 때, 0x080485e3은 scanf로 10진수를 입력받고 있기 때문에 10진수로 바꾸어 134514147로 넣어주어야 한다.
이렇게 하면 clear할 수 있다.
'Wargame > pwnable.kr' 카테고리의 다른 글
pwnable.kr cmd1 (0) | 2019.02.01 |
---|---|
pwnable.kr asm (0) | 2019.02.01 |
pwnable.kr random (0) | 2019.02.01 |
pwnable.kr collision (0) | 2019.02.01 |
pwnable.kr flag (0) | 2019.02.01 |
댓글