[原创] try to pwn WriteUp
发表于:
2019-7-25 09:03
8013
题目二进制地址
运行题目,输入名字,运行截图如图:
丢入IDA,main函数如图
到welcome函数
发现使用 scanf 并且没有检查输入长度。 查看name变量发现其指向bss段,是全局变量,地址为0x080EF9E0
这种条件下,我们可以写入足够多的字节,溢出后面的全局变量。 从name变量向后查找,发现一个全局变量,地址为 0x80EFA00
查找其引用:
跳转到 menu+A1 位置,有如下代码。
可以看到 mov eax, ds:dword_80EFA00; test eax,eax; jz short loc_8048BBA
当全局变量ds:dword_80EFA00
不为0,则继续执行下面代码,并且全局变量ds:dword_80EFA00
作为参数传入fclose函数中。所以该全局变量必然是一个文件指针。指向一个文件结构体。
并且该文件 fake 是静态编译而成的。
跳转到fclose函数。可以发现存在这样一个执行路径(先寻找 call reg指令,然后结合数据流和控制流分析)。
分析代码
我们知道ebx=[ebp+8]
,所以ebx存储着第一个参数,也就是文件结构体的指针。eax = [ebx]
<u>只要文件指针指向的第一个字节 eax
与20h 之后为0,我们可以执行执行0x0804F8F7
处的代码。</u>
继续执行到 0x0804F915
, eax = [ebx+94h], call [eax+8]
结合fclose的分析:利用flose实现任意地址执行 ebx实际指向一个结构体
大胆推测一下 eax = [ebx+94h]
即为 vtable。
而FILE
结构体定义为
所以我们想办法将内存构造成,注意构造的同时,内容不要包含空格、换行和制表符,否则scanf会截断。
.bss
因为我们只能控制bss段内容。 因此,我们要进行栈迁移操作。 可以利用 xchg esp, eax; ret; 然后再利用写入的数据,执行RoP,获取shell。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-7-25 09:06
被j3rry编辑
,原因: 上传图片