部分转自师弟
baby_diary
delete跟show没问题,在add功能中溢出一个字节
该flag的范围为[0~0xf],所以可以当一个off-by-null来做
难点在于堆块的构造和pre_size的伪造
1、堆块的构造,利用large bin和unsorted中残留的堆地址操作
2、pre_size,先off-by-null(需要堆内容全为’\x00’),再free后重新申请利用flag写入pre_size
具体步骤解释看exp注释
1 |
|
pipeline
append函数中两个size的比较是有符号数,因此可以用负数
而且read_str中的size强转成了int16,因此这里可以溢出;通过溢出覆盖下一个堆指针实现任意地址写。
在edit函数中使用了realloc函数申请堆,所以size为0时为free
1 | #coding:utf-8 |
baby_pwn
edit函数中存在off-by-null
输出函数加密了,解密不难,可以解,但也可以用io_file(笨比就用io_file直接打了)
禁用了execve,所以需要orw,远程的环境读的是flag.txt
1 | #coding:utf-8 |
[强网先锋] orw
add函数和delete函数都没有对index进行限制,所以可以越界写
写free@got实现read读shellcode,只能写8个字节,所以只需要控制必需的寄存器就行了,rax,rdi本身为0不需要修改,rdx可由index控制;所以只需要控制rsi寄存器即可。
1 | #coding:utf-8 |
[强网先锋] no_output
输入0x20个字符到src变量中,在后面的strcpy中则会溢出一个0字节覆盖un_804C080为0,获得多一次的输入,绕过sub_8049385的检测进入函数sub_8049269
这里有一个浮点异常信号处理,需要使得v2[0]/v1
触发浮点运算异常,且v1不能为0
可以构造分子为无符号最小整数,分母为-1,相除时发生溢出,从而调用目标函数
之后 dl_resolve即可
1 | #coding:utf-8 |