【CTF Reverse】CTFShow re2 Writeup(反编译+XOR+RC4)

re2

30
感谢@W22提供的题目


工具

解法

解压压缩包。

txt 文件里是乱码。

exe 文件导入 DIE 分析。是一个 PE32 程序。

导入 IDA,按 F5 查看 main_0 函数伪代码。

int __cdecl main_0(int argc, const char **argv, const char **envp)
{
  char v4; // [esp+0h] [ebp-44Ch]
  char v5; // [esp+0h] [ebp-44Ch]
  char v6; // [esp+0h] [ebp-44Ch]
  char v7; // [esp+0h] [ebp-44Ch]
  char v8; // [esp+0h] [ebp-44Ch]
  char v9; // [esp+0h] [ebp-44Ch]
  _DWORD v10[3]; // [esp+194h] [ebp-2B8h] BYREF
  int v11; // [esp+1A0h] [ebp-2ACh]
  FILE *v12; // [esp+1ACh] [ebp-2A0h]
  FILE *v13; // [esp+1B8h] [ebp-294h]
  char v14[264]; // [esp+1C4h] [ebp-288h] BYREF
  char v15[264]; // [esp+2CCh] [ebp-180h] BYREF
  char Str1[60]; // [esp+3D4h] [ebp-78h] BYREF
  char Str[56]; // [esp+410h] [ebp-3Ch] BYREF

  __CheckForDebuggerJustMyCode(&unk_40B027);
  memset(Str, 0, 50);
  memset(Str1, 0, 50);
  memset(v15, 0, 0x100u);
  memset(v14, 0, 0x100u);
  v11 = 1;
  do
  {
    sub_401037("**************************我的Flag出了什么问题??**************************\n", v4);
    sub_401037(asc_406BFC, v5);
    sub_401037("**************************那有没有恢复的方法呢??**************************\n", v6);
    sub_401037(asc_406CA8, v7);
    sub_401037("做出你的选择:\n", v8);
    sub_401037("1.充钱\n2.退出\n", v9);
    sub_401073("%d", (char)v10);
    if ( v10[0] == 1 )
    {
      v13 = fopen("flag.txt", "r");
      if ( !v13 )
      {
        sub_401037("打开源文件失败!\n", v4);
        getchar();
        exit(0);
      }
      v12 = fopen("enflag.txt", "w");
      if ( !v12 )
      {
        sub_401037("找不到加密文件!\n", v4);
        getchar();
        exit(0);
      }
      sub_401037("\n请输入您的密钥:", v4);
      sub_401073("%s", (char)Str);
      sub_401069(Str, Str1);
      sub_401028(Str, v15, v14, v13, v12);
    }
    else if ( v10[0] == 2 )
    {
      v11 = 0;
    }
    else
    {
      sub_401037("\n操作不合法!\n\n", v4);
    }
  }
  while ( v11 );
  return 0;
}

顺着 sub_401069 深入,找到 sub_401A70 函数。可以知道,Str1 为 Str 和 0x1F 进行异或运算的结果。

char __cdecl sub_401A70(char *Str, char *Str1)
{
  char v3; // [esp+0h] [ebp-E4h]
  signed int i; // [esp+D0h] [ebp-14h]
  signed int v5; // [esp+DCh] [ebp-8h]

  __CheckForDebuggerJustMyCode(&unk_40B027);
  v5 = strlen(Str);
  for ( i = 0; i < v5; ++i )
    Str1[i] += Str[i] ^ 0x1F;
  if ( !strcmp(Str1, "DH~mqqvqxB^||zll@Jq~jkwpmvez{") )
    sub_401037("充值成功.\n", v3);
  else
    sub_401037("Error!\n", v3);
  return *Str1;
}

用 C++ 写个解密程序。

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

int main() {
	string str, str2;

	cin >> str2;
	for (auto &i : str2) {
		str += i ^ 0x1F;
	}
	cout << str;
	return 0;
}

输入:

DH~mqqvqxB^||zll@Jq~jkwpmvez{

输出:

[Warnning]Access_Unauthorized

顺着 sub_401028 深入。

int __cdecl sub_4014E0(char *Str, int a2, int a3, FILE *Stream, FILE *a5)
{
  char v6; // [esp+0h] [ebp-D8h]
  size_t v7; // [esp+D0h] [ebp-8h]

  __CheckForDebuggerJustMyCode(&unk_40B027);
  v7 = strlen(Str);
  sub_4010F0(a2, Str, v7);
  sub_4010C8(a3);
  sub_40116D(a3, a2);
  sub_4010EB(a3, Stream, a5);
  fclose(Stream);
  fclose(a5);
  return sub_401037(aE, v6);
}

找到 sub_4015E0 函数,这是 RC4 加密算法。

int __cdecl sub_4015E0(int a1, FILE *Stream, FILE *a3)
{
  int result; // eax
  char v4; // [esp+103h] [ebp-35h]
  char i; // [esp+11Bh] [ebp-1Dh]
  int v6; // [esp+124h] [ebp-14h]
  int v7; // [esp+130h] [ebp-8h]

  __CheckForDebuggerJustMyCode(&unk_40B027);
  v7 = 0;
  v6 = 0;
  for ( i = fgetc(Stream); ; i = fgetc(Stream) )
  {
    result = i;
    if ( i == -1 )
      break;
    v7 = (v7 + 1) % 256;
    v6 = (v6 + *(unsigned __int8 *)(v7 + a1)) % 256;
    v4 = *(_BYTE *)(v7 + a1);
    *(_BYTE *)(v7 + a1) = *(_BYTE *)(v6 + a1);
    *(_BYTE *)(v6 + a1) = v4;
    fputc(*(_BYTE *)((*(unsigned __int8 *)(v6 + a1) + *(unsigned __int8 *)(v7 + a1)) % 256 + a1) ^ i, a3);
  }
  return result;
}

用 winhex 将 enflag.txt 转成 base64。

w4KjJfZMNjtZzMTp8bUyGLGWrr8INQ==

使用 RC4 解密工具。密钥刚刚已经计算出来了:

[Warnning]Access_Unauthorized

取得 flag。

Flag

flag{RC4&->ENc0d3F1le}

声明

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值