攻防世界 easyCpp

easyCpp

C++逆向的题, 刚开始接触很多代码看不懂,感觉可读性低. 但是看多了, 还是会好很多. 是一个慢慢熟悉stl的过程吧.

  • 经过了一些CPP逆向题的折磨, 这个题大多数函数连懵带猜的看起来还好, 但是遇到了一个不仔细的错误, 想了很久…

  • 64位elf文件, 载入ida, 函数的大部分还是看懂了. 2个关键函数. transform accumulate

    攻防世界 easyCpp_第1张图片

  • 先进入 transform. 算法也是很简单, 就是函数读起来更麻烦.

攻防世界 easyCpp_第2张图片

  • 下面 accumulate. 这个看起来就不是那么容易了, 有很多地址传过来传过去就很混淆. 那就ida动态调试看看这个函数是做什么.(也是这里自己想了很久的错误, 虽然很简单的, 可能是stl把自己搞昏了吧).

攻防世界 easyCpp_第3张图片

  • 发现错误, 重新调试后得到经过 accumulate 函数后的结果. 把结果都记录下来后. 发现只是把 transform函数后的结果进行了逆序.攻防世界 easyCpp_第4张图片

  • 开始写 exp: 得到 987 -377 -610 -754 -843 -898 -932 -953 -966 -974 -979 -982 -984 -985 -986 -986. 最后在linux下运行程序输入.

    #include 
    
    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;
    } 
    

攻防世界 easyCpp_第5张图片

  • 总结: (1)注意传递的参数是指针还是值. (2)cpp逆向太多数都有一个模板一样, 动态调试注意地址的寻找.

你可能感兴趣的:(攻防世界 easyCpp)