hitcon2017 Everlasting Imaginative Void

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指令实现的,还给出了一篇参考文档

最近没啥时间,有空的时候我再仔细读一读吧(懒

看完这道题的解法之后,真心觉得这题出得好,同时也发现自己比想象中还要弱得多,还需继续努力啊(

发表评论

电子邮件地址不会被公开。 必填项已用*标注