首页
社区
课程
招聘
[原创]noheap
发表于: 2018-6-26 23:33 3042

[原创]noheap

2018-6-26 23:33
3042

这道题首先需要登录,给了一个hash出来。

通过逆向可知,拿到4个随机byte后映射到了[0x30303030, 0x5a5a5a5a],之后做了一些hash算法。hash算法不太重要,因为这个范围可以直接爆破。

继续看题。

核心逻辑在0x1470处,注意到这里跳转是跳到一个奇怪的地址0x1107上,跟过去发现是一个vm。

回头看,发现跳转目标是异或计算得来,输入的选项也被用来计算取值了,那么init_array里面应该有东西。0xCB5这里做了初始化工作,用随机值和函数地址异或,发到一张表里。跳转时就是从表里取值,并且同时给0x203140写了一些值。简单看一眼vm,发现0x203140就是vmcode。

略过vm,先看堆操作逻辑。可以看到0x1674有明显溢出,size设0即可同时溢出堆和bss。不过因为更新全局变量在后,所以覆盖不了0x203240全局变量,否则可覆盖指针。

showfree写的很死,而且分配时还限制了size,无法走house of orange的套路,那么堆溢出不可行了,应该走bss了。

堆溢出仍然可行,见https://bbs.pediy.com/thread-229401.htm

动态调试观察bss,发现0x203140可以覆盖,也就是说可以控制vmcode。那么这题就变成vm逆向题了。

直接动态调试猜测vm逻辑,下命令断在0x118E,走一次malloc的逻辑,追出rax和vm结构体内容,再稍加猜测、标注结构体,如下:

那么走这个vm,就可以任意控制pc,并且可以从栈上读取现成的值,再观察最后一步跳转到实际malloc逻辑的栈情况,发现one_gadget可用。于是思路就是从栈上拿一个libc地址出来,做偏移得出one_gadget,跳转即可:

最后利用脚本如下:

总体说来此题漏洞明显,hash爆破和vm逆向也比较轻松。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2018-6-29 16:44 被diycode编辑 ,原因:
收藏
免费 4
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//