hitcon每年都会出一些神题来让我认识自己是多么的弱小,这道题就是其中之一(
参考文章:
http://pwning.fun//writeup/2017/11/03/HitconCTF2017-Everlasting-Imaginative-Void.html
打开ida,习惯性地找到main函数,然后按了一下f5:
哇,这是什么鬼
于是决定看看汇编:
emmmm,似乎没有啥问题。
然后就没啥思路了(orz
参考文章中提到,能改变程序流程的话有两种方法:
- got表 hook
- 修改_init_array和_fini_array
第二个方法之前在使用翱翔爷爷写的ollvm的时候见识过一次,但是我也并没有在这个地方看出什么问题。
这里的突破点是审计elf头中指定这两个数组大小的地方,从ida中可以看到:
_init_array的大小为8,而_fini_array的大小为16,这里的_fini_array肯定是有问题的,但是在ida中定位到对应的地方的话:
这里把_fini_array多出来的部分标成了LOAD段,有点诡异,所以直接审计这个地方还真的不好发现这个点。
于是动态调试一下,发现这个地方在运行时候的值会指向这里:
而前面那个call是指向elf头的一段:
这个地方动态调试一下可以发现这里rdi就是指向跳转过来的地方,而这个地方判断了输入的第16是否为’!’
最后一直跟可以跟到这个位置:
emmmmm,这个地方确实有点难受,强行f5也是几乎不能看:
据参考文章说,这里进行了10轮aes加密,是直接用处理器的aes指令实现的,还给出了一篇参考文档
最近没啥时间,有空的时候我再仔细读一读吧(懒
看完这道题的解法之后,真心觉得这题出得好,同时也发现自己比想象中还要弱得多,还需继续努力啊(