逆向练习一

Newbie_calculations这道题刚开始看的时候,特别多的函数着实被吓到了,但是仔细分析其实可以发现里面很多东西就是迷惑我们思路的开始运行发现,根本运行不完,所以只能看代码,发现没有输入点,观察结尾,应该是最后自动打印flag,这时候应该是要我们理解算法复刻算法了有三个算法,其实就是加减乘,加法比较简单,这里面的逻辑开始我发现根本运行不完的,但是计算机不能用平常数学来看,负数会用...
摘要由CSDN通过智能技术生成

Newbie_calculations

这道题刚开始看的时候,特别多的函数着实被吓到了,但是仔细分析其实可以发现里面很多东西就是迷惑我们思路的
开始运行发现,根本运行不完,所以只能看代码,发现没有输入点,观察结尾,应该是最后自动打印flag,这时候应该是要我们理解算法复刻算法了
在这里插入图片描述
有三个算法,其实就是加减乘,加法比较简单,这里面的逻辑开始我发现根本运行不完的,但是计算机不能用平常数学来看,负数会用补码ffffffffff代替的,a1从他的初始值开始-1,这里注意v4 = -a2,所以这里他要减fffffffff+a2次,后面的循环再加ffffffff次,最终结果是a1+a2
在这里插入图片描述
乘的话同理,里面嵌套了一个加,那个加第一个值是0第二个值是乘的一个参数,然后执行另一个参数的次数
在这里插入图片描述
最后的那个减,我现在还是没有看懂,希望大佬能教一教,我总觉得他的那个逻辑好像错了
最后我是把他们整理到C++上,然后又用python转了一下码得到的flag,接下来是代码

#include<iostream>
#include<stdlib.h>
#include<string>
#include<stdlib.h>
using namespace std;
int mul(int a,int b)
{
    return a*b;
}
int add(int a,int b)
{
    return a+b;
}
int sub(int a,int b)
{
    return a-b;
}
int made(int a,int b)
{
	float v4=0xffffffffffffffff;
	
}
int main(){
int i;
int v121,v3;
int a[32];
for ( i = 0; i < 32; ++i )
a[i] = 1;
v121 = 0;
puts("Your flag is:");
v3 = mul(a[0], 0x3B9ACA00);
v3 = sub(v3, 0x3B9AC9CE);
a[0]=mul(v3, 2);
v3 = add(a[1], 5000000);
v3 = sub(v3, 6666666);
v3 = add(v3, 1666666);
v3 = add(v3, 45);
v3 = mul(v3, 2);
a[1]=add(v3, 5);
v3 = mul(a[2], 1000000000);
v3 = sub(v3, 999999950);
v3 = mul(v3, 2);
a[2]=add(v3, 2);
v3 = add(a[3], 55);
v3 = sub(v3, 3);
v3 = add(v3, 4);
a[3]=sub(v3, 1);
v3 = mul(a[4], 100000000);
v3 = sub(v3, 99999950);
v3 = mul(v3, 2);
a[4]=add(v3, 2);
v3 = sub(a[5], 1);
v3 = mul(v3, 1000000000);
v3 = add(v3, 55);
a[5]=sub(v3, 3);
v3 = mul(a[6], 1000000);
v3 = sub(v3, 999
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值