首页
社区
课程
招聘
[原创] try to pwn WriteUp
发表于: 2019-7-25 09:03 8013

[原创] 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编辑 ,原因: 上传图片
收藏
免费 2
支持
分享
最新回复 (2)
雪    币: 649
活跃值: (73)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
图怎么挂了
2019-7-25 09:04
0
雪    币: 6112
活跃值: (1212)
能力值: (RANK:30 )
在线值:
发帖
回帖
粉丝
3
感谢分享~
2019-7-25 11:12
0
游客
登录 | 注册 方可回帖
返回
//