攻防世界 easyCpp

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逆向太多数都有一个模板一样, 动态调试注意地址的寻找.
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值