BUUCTF逆向第四题(内涵的软件1)解题思路

下载exe文件后先查壳

无壳,32位,所以后续应使用IDA32来进行操作

将文件导入IDA

下面是一个错误方向,也是我们最常想到的思路,即检索字符串、交叉引用、查看伪代码再进行分析

按shift+12检索字符串,检索flag

找到相应的函数并查看伪代码。

这里可以发现伪代码中V4是没有值的,而且其他量也都没有涉及flag,flag涉及的语句仅作为if语序中的一个条件。

int __cdecl _ftbuf(unsigned int a1, _DWORD *a2)
{
  int result; // eax
  int v3; // eax
  char v4; // [esp+0h] [ebp-10h]

  if ( a1 >= 2 && _CrtDbgReport(2, (int)"_sftbuf.c", 161, 0, "flag == 0 || flag == 1", v4) == 1 )
    __debugbreak();
  if ( a1 )
  {
    result = a2[3] & 0x1000;
    if ( result )
    {
      _flush(a2);
      v3 = a2[3];
      BYTE1(v3) &= 0xEEu;
      a2[3] = v3;
      a2[6] = 0;
      result = (int)a2;
      *a2 = 0;
      a2[2] = 0;
    }
  }
  else
  {
    result = a2[3] & 0x1000;
    if ( result )
      return _flush(a2);
  }
  return result;
}

正确方向

我们回到最开始的主函数,发现这里真正的主函数是main_0

查看伪代码

int __cdecl main_0(int argc, const char **argv, const char **envp)
{
  char v4[4]; // [esp+4Ch] [ebp-Ch] BYREF
  const char *v5; // [esp+50h] [ebp-8h]
  int v6; // [esp+54h] [ebp-4h]

  v6 = 5;
  v5 = "DBAPP{49d3c93df25caad81232130f3d2ebfad}";
  while ( v6 >= 0 )
  {
    printf(&byte_4250EC, v6);
    sub_40100A();
    --v6;
  }
  printf(asc_425088);
  v4[0] = 1;
  scanf("%c", v4);
  if ( v4[0] == 89 )
  {
    printf(aOd);
    return sub_40100A();
  }
  else
  {
    if ( v4[0] == 78 )
      printf(&byte_425034);
    else
      printf(&byte_42501C);
    return sub_40100A();
  }
}

分析一下发现v5的大括号里的部分正是flag,而这段伪代码其实与v5没有太大关系,正确的flag就是v5大括号里的字符串。

### BUUCTF 逆向工程 Writeup 解题报告 #### 选择合适的目并分析目标程序 在BUUCTF平台上,逆向工程项目通常涉及对二进制文件或脚本的反编译和静态/动态分析。为了找到解题思路,建议从简单的目入手,逐步提升难度。每道目都会给出一个可执行文件或其他类型的程序作为挑战对象。 #### 使用工具辅助分析 常用的逆向工程工具有IDA Pro、Ghidra以及Radare2等[^1]。这些工具可以帮助加载待分析的目标程序,并提供汇编代码视图、函数调用图表等功能支持。对于初学者来说,Ghidra是一个不错的选择因为它免费开源而且功能强大。 #### 寻找关键逻辑与特征字符串 通过对程序进行初步浏览后,应该重点关注那些看起来像是验证输入或者处理核心业务的地方。很多时候,在二进制内部能找到一些提示性的文本串(如错误消息),它们往往指向了我们需要破解的关键部分。 #### 尝试修改行为或绕过保护机制 一旦明确了要攻击的方向,则可以通过打补丁的方式改变原有流程达到目的;或者是利用某些已知漏洞来规避安全措施。例如,在面对加壳软件时,可以尝试脱壳后再做进一步的研究工作。 #### 编写自动化脚本来加速测试过程 当遇到重复性高的操作任务时,不妨编写Python脚本配合调试器使用以提高效率。比如自动发送不同参数组合给被测应用直至触发预期效果为止。 ```python import subprocess for i in range(100): result = subprocess.run(['./target_binary', str(i)], capture_output=True, text=True) if "success" in result.stdout.lower(): print(f"Found solution at input {i}") break ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值