buuctf [GWCTF 2019]xxor 19

本文详细解析了如何使用IDA Pro逆向工程工具,逐步揭开一个复杂函数的运行逻辑,通过数学运算和循环倒置,最终揭示了输入数字的变换过程,并成功输出flag{re_is_great!}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.先把下载下来的文件改成exe文件,
2.查看文件是多少位的
3.ida打开
4.主函数,伪代码查看
在这里插入图片描述
先从最后面开始看,当if()体里面的值=1的时候才是我们想要的
点开函数

signed __int64 __fastcall sub_400770(_DWORD *a1)
{
  signed __int64 result; // rax

  if ( a1[2] - a1[3] != 2225223423LL || a1[3] + a1[4] != 4201428739LL || a1[2] - a1[4] != 1121399208LL )
  {
    puts("Wrong!");
    result = 0LL;
  }
  else if ( *a1 != 0xDF48EF7E || a1[5] != 0x84F30420 || a1[1] != 550153460 )
  {
    puts("Wrong!");
    result = 0LL;
  }
  else
  {
    puts("good!");
    result = 1LL;
  }
  return result;
}

我们会发现a[0]-a[5]的数组,通过计算我们可以知道
a[0] = 3746099070,
a[1] = 550153460,
a[2] = 3774025685,
a[3] = 1548802262,
a[4] = 2652626477,
a[5] = 2230518816.

往上走,我们会发现对我们输入的数字进行变化
sub_400686((unsigned int *)&dword_601078, &unk_601060);
&unk_601060的值我们点开看一下发现怎么那麽长,其实就是{2,2,3,4}
然后打开函数400686
在这里插入图片描述
怎么来的我们就怎么倒回去
将中间的循环进行倒置

#include <stdio.h>
int main()
{
	unsigned int xorm[6];
	xorm[0] = 3746099070;
	xorm[1] = 550153460;
	xorm[2] = 3774025685;
	xorm[3] = 1548802262;
	xorm[4] = 2652626477;
	xorm[5] = 2230518816;
	int i = 0,j=0,sum;
    int temp[2] = {0};
	int data[4] = { 2,2,3,4 };//unk哪个数字
	for (i = 0; i < 5; i += 2)
	{
		temp[0] = xorm[i];
		temp[1] = xorm[i + 1];

		sum = 0x458BCD42 * 64;
		for (j = 0; j < 64; j++)
		{
			temp[1] -= (temp[0] + sum + 20) ^ ((temp[0] << 6) + 3) ^ ((temp[0] >> 9) + 4) ^ 0x10;
			temp[0] -= (temp[1] + sum + 11) ^ ((temp[1] << 6) + 2) ^ ((temp[1] >> 9) + 2) ^ 0x20;
			sum -= 0x458BCD42;
		}
		xorm[i] = temp[0];
		xorm[i + 1] = temp[1];
	}
	for (i = 0; i < 6; i++)
		printf("%c%c%c", *((char*)&xorm[i]+2), *((char*)&xorm[i] + 1), *(char*)&xorm[i]);
}

flag
flag{re_is_great!}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值