这道题大多数的wp不知道这个程序是怎么跑的。
这道题是由一个知名的日本战队zer0pts出的,还是挺新颖,挺有意思的
总体感知
首先来看看ida里的情景
这就是main函数的所有了,很简单,感觉啥也没有,输入那串用于比较的字符当然是没用的。
那就看看a1是不是在之前有加密,调交叉引用到start函数
但是从这里找也没找到加密,所以,此题暗藏玄机呀。
函数挺少的,注意看下来不难发现下面这个函数绝对是加密函数
很多wp做到这里就结束了,但这不够!
实现细节分析
交叉引用说明,这个函数没有被引用,但是按照ida反编译的机制,不执行的代码理应不反编译,这么说,这个代码一定是通过某种方式运行了!
这个函数看似平平无奇,但是正是这个程序这么奇怪的关键。
它做了几件非常少见的事情,就是把strcmp这个函数的地址给某个参数了,还把它附给了qword_201090这个变量
另外还把另一个函数附给了off_201028这个参数。
跟随这些交叉引用,去看看这个程序到底是怎么隐藏自己的动机的。
竟然一下子到start里面的init函数了,有点迷惑,还是看汇编吧。
这里调用了一个函数,这后面的funcs_......就是这个函数的地址了,根据之前交叉引用的结果,这应该就是我们上面分析的那个函数了
也就是说,在系统调用start的时候,在这里隐秘地调用了这个函数,执行了上面一系列函数地址的赋值操作。
然后回来看我们上面找到的奇怪函数究竟干了什么?先看qword_201090的交叉引用表。
6eA这个函数就是一开始我们找到的疑似加密的函数。也就是说,那个没有交叉引用的函数,实际上是在程序运行过程中连上主函数的
进入加密函数
由于qword_201090已经装上了strcmp的地址,那么此时返回qword_201090实际上就是在调用strcmp函数了。
再看看off_201028的交叉引用表
点进去看汇编
发现这个_strcmp其实并非真正的strcmp,里面暗藏玄机呀!运行_strcmp的时候就会跳转到off_201028也就是其中装上的6EA函数(即加密函数)
现在逻辑全了
整个程序运行的流程
所以你输入的内容,就这样不知不觉的进行了加密,还是挺巧妙的~
最后答案虽然不重要,但是都做到这一步了,也就给了吧
答案
flag{l3ts_m4k3_4_DETOUR_t0d4y}