分析
进入IDA查看后能看到input key的位置,以为又是一道很清晰的逆向题,跟进后发现后面只有一个check CheckStringIsNumber。也就是说只要是数字就可以通过这个验证,以及有几个反调试函数detectDebugging 和 checkDebuggerProcessRunning。以为在动态调试的时候修改返回值即可,但是几次之后发现了不对劲。仔细看之后发现了fork函数
关于fork函数的解释 https://www.cnblogs.com/dongguolei/p/8086346.html
也就是说,程序在执行到fork之后,会同时开启两个进程。v3=0与v3=pid。在动态调试时,fork函数的返回值为0,即我们调试的为子进程。子进程与父进程公用一个pip函数创建的管道来共享数据。所以这里分析到下面
这里的confuseKey函数也很简单,if逻辑也很简单。直接看confuseKey,将程序分为4段,打乱顺序为3412所以这里可以从最后的strcmp得到flag 为 {53fc275d81053ed5be8cdaf29f59034938ae4efd} 提交的时候去掉花括号。但是这里深思一下,如果下面的逻辑没有这么简单呢,如果一定要动态调试到下面呢。想了一下,只要修改程序EIP,直接跳转到验证数据的地方,将验证函数的参数修改为我们想要输入的值即可动态跟踪。
总结
这里主要考察的还是静态分析,虽然不难,但是动态分析上很有意思。一开始以为只是简简单单的反调试,后来新认识了fork函数,还是很有收获的。
明日计划
- 下一题攻防世界
- 复习
前段时间课程结课实验和一些简单的学校比赛没怎么刷题,最近继续复习考试。