【CTF Reverse】XCTF GFSJ1094 easyxor Writeup(反编译+逆向工程+XOR)

easyxor

非常easy的xor


解法

拉进 DIE 分析。

导入 IDA。

按 F5 反汇编。

int __fastcall main(int argc, const char **argv, const char **envp)
{
  int v3; // eax
  char v4; // al
  int v5; // eax
  char v7; // [rsp+33h] [rbp-Dh]
  char v8; // [rsp+33h] [rbp-Dh]
  int v9; // [rsp+34h] [rbp-Ch]
  int i; // [rsp+38h] [rbp-8h]
  int v11; // [rsp+3Ch] [rbp-4h]

  _main();
  v11 = 0;
  v9 = 0;
  puts("Please input your flag:");
  while ( 1 )
  {
    v8 = getchar();
    if ( v8 == 10 )
      break;
    v7 = key[v9 % 4] ^ v8;
    while ( 1 )
    {
      v4 = v7--;
      if ( v4 <= 0 )
        break;
      v3 = v11++;
      s[v3] = 1;
    }
    v5 = v11++;
    s[v5] = 0;
    ++v9;
  }
  while ( v11 <= 2559 )
    s[v11++] = -1;
  for ( i = 0; i <= 2559; ++i )
  {
    if ( r[i] != s[i] )
    {
      puts("Lose lose lose!");
      break;
    }
  }
  if ( i == 2560 )
    puts("Win win win!");
  system("pause");
  return 0;
}

输入先和 key 异或,然后和 r 数组比较。

    v7 = key[v9 % 4] ^ v8;

找到 key。

SCNU

找到 r。

.data:0000000000403080 ; _BYTE r[2560]
.data:0000000000403080 r               db 35h dup(1), 0, 2Fh dup(1), 0, 2Fh dup(1), 0, 32h dup(1)
.data:0000000000403080                                         ; DATA XREF: main+E1↑o
.data:0000000000403148                 db 0, 28h dup(1), 0, 14h dup(1), 0, 27h dup(1), 0, 3Bh dup(1)
.data:00000000004031EA                 db 0, 3Dh dup(1), 0, 70h dup(1), 0, 3Ch dup(1), 0, 0Ah dup(1)
.data:00000000004032E1                 db 0, 3Dh dup(1), 0, 73h dup(1), 0, 3Ah dup(1), 0, 0Ah dup(1)
.data:00000000004033D9                 db 0, 1Fh dup(1), 0, 73h dup(1), 0, 3Dh dup(1), 0, 66h dup(1)
.data:0000000000403512                 db 0, 21h dup(1), 0, 1Ch dup(1), 0, 6Dh dup(1), 0, 28h dup(1)
.data:00000000004035E8                 db 0, 497h dup(0FFh)
.data:0000000000403A80 ; Function-local static variable

提取出 r 数字中的数据:

0x35, 0x2F, 0x2F, 0x32, 0x28, 0x14, 0x27, 0x3B,0x3D, 0x70, 0x3C, 0x0A, 0x3D, 0x73, 0x3A, 0x0A,0x1F, 0x73, 0x3D, 0x66, 0x21, 0x1C, 0x6D, 0x28

用 C++ 写出解码程序:

#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;

char key[] = "SCNU";
int r[] = {0x35, 0x2F, 0x2F, 0x32, 0x28, 0x14, 0x27, 0x3B,
		   0x3D, 0x70, 0x3C, 0x0A, 0x3D, 0x73, 0x3A, 0x0A,
		   0x1F, 0x73, 0x3D, 0x66, 0x21, 0x1C, 0x6D, 0x28};

int main() {
	int j = 0;
	string ans = "";
	for (auto i : r) {
		ans += i ^ key[j++ % 4];
	}
	cout << ans;
	return 0;
}

Flag

flag{Winn3r_n0t_L0s3r_#}

声明

本博客上发布的所有关于网络攻防技术的文章,仅用于教育和研究目的。所有涉及到的实验操作都在虚拟机或者专门设计的靶机上进行,并且严格遵守了相关法律法规

博主坚决反对任何形式的非法黑客行为,包括但不限于未经授权的访问、攻击或破坏他人的计算机系统。博主强烈建议每位读者在学习网络攻防技术时,必须遵守法律法规不得用于任何非法目的。对于因使用这些技术而导致的任何后果,博主不承担任何责任

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值