-
-
[原创]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
全局变量,否则可覆盖指针。
show
和free
写的很死,而且分配时还限制了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逆向也比较轻松。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!