easyCpp
C++逆向的题, 刚开始接触很多代码看不懂,感觉可读性低. 但是看多了, 还是会好很多. 是一个慢慢熟悉stl的过程吧.
-
经过了一些CPP逆向题的折磨, 这个题大多数函数连懵带猜的看起来还好, 但是遇到了一个不仔细的错误, 想了很久…
-
64位elf文件, 载入ida, 函数的大部分还是看懂了. 2个关键函数. transform accumulate
-
先进入 transform. 算法也是很简单, 就是函数读起来更麻烦.
- 下面 accumulate. 这个看起来就不是那么容易了, 有很多地址传过来传过去就很混淆. 那就ida动态调试看看这个函数是做什么.(也是这里自己想了很久的错误, 虽然很简单的, 可能是stl把自己搞昏了吧).
-
发现错误, 重新调试后得到经过 accumulate 函数后的结果. 把结果都记录下来后. 发现只是把 transform函数后的结果进行了逆序.
-
开始写 exp: 得到 987 -377 -610 -754 -843 -898 -932 -953 -966 -974 -979 -982 -984 -985 -986 -986. 最后在linux下运行程序输入.
#include <stdio.h> int fib(int a) { if(!a || a == 1) return 1; return fib(a-1) + fib(a-2); } int main(void) { int flag[100] = {0}, i = 0; for(i = 0; i <= 15; i++) { flag[i] = fib(i); } for(i = 15; i >= 0; i--) { printf("%d ", flag[i] = (i < 15 ? flag[i] - flag[15]:flag[i])); } return 0; }
- 总结: (1)注意传递的参数是指针还是值. (2)cpp逆向太多数都有一个模板一样, 动态调试注意地址的寻找.