CTF逆向-IDA Pro攻防世界Hello CTF

前言

交互式反汇编器专业版(Interactive Disassembler Professional),人们常称其为 IDA Pro,或简称为 IDA。是目前最棒的一个静态反编译软件,为众多 0day 世界的成员和 ShellCode 安全分析人士不可缺少的利器!IDA Pro 是一款交互式的,可编程的,可扩展的,多处理器的,交叉 Windows 或 Linux WinCE MacOS 平台主机来分析程序, 被公认为最好的花钱可以买到的逆向工程利器。IDA Pro 已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。它支持数十种 CPU 指令集其中包括 Intel x86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051 等等。

本文通过攻防世界一道逆向题目 Hello, CTF 来入门学习下 IDA Pro 反汇编神器的使用和 exe 文件的逆向分析。

Hello CTF

题目如下,附件下载地址
在这里插入图片描述下载后是个 exe 的文件,双击执行后如下:
在这里插入图片描述
应该是需要输入正确的字符串才能得到想要的结果。

IDA反汇编

1、使用查壳工具查看目标 exe 文件,无壳,32位:
在这里插入图片描述

2、将目标 exe 文件拖入 IDA 神器:
在这里插入图片描述3、点击 Tab 健或者 F5 键,可对程序进行反编译并查看伪代码:

在这里插入图片描述4、完整代码如下:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int i; // ebx
  char v4; // al
  int result; // eax
  int v6; // [esp+0h] [ebp-70h]
  int v7; // [esp+0h] [ebp-70h]
  char Buffer[2]; // [esp+12h] [ebp-5Eh] BYREF
  char v9[20]; // [esp+14h] [ebp-5Ch] BYREF
  char v10[32]; // [esp+28h] [ebp-48h] BYREF
  __int16 v11; // [esp+48h] [ebp-28h]
  char v12; // [esp+4Ah] [ebp-26h]
  char v13[36]; // [esp+4Ch] [ebp-24h] BYREF

  strcpy(v13, "437261636b4d654a757374466f7246756e");
  while ( 1 )
  {
    memset(v10, 0, sizeof(v10));
    v11 = 0;
    v12 = 0;
    sub_40134B(aPleaseInputYou, v6);
    scanf("%s", v9);
    if ( strlen(v9) > 0x11 )
      break;
    for ( i = 0; i < 17; ++i )
    {
      v4 = v9[i];
      if ( !v4 )
        break;
      sprintf(Buffer, "%x", v4);
      strcat(v10, Buffer);
    }
    if ( !strcmp(v10, v13) )
      sub_40134B(aSuccess, v7);
    else
      sub_40134B(aWrong, v7);
  }
  sub_40134B(aWrong, v7);
  result = --Stream._cnt;
  if ( Stream._cnt < 0 )
    return _filbuf(&Stream);
  ++Stream._ptr;
  return result;
}

代码第 36 行处进行了一个字符串比较,如果 v10 的值等于 v13 的值会反馈一个 success 的输出。v13 的值在第 15 行给出,因此需要知道 v10 是怎么处理的。

代码的第 18 行对 v10 进行了初始化,并在 32 行进行了拼接处理。分析 26-35 行的循环,其逻辑是:依次取出用户输入字符串的字符,将字符值的 ASCII 码值转成 16 进制的形式拼接到 v10 中。因此,若想令 v10 的值等于 v13 的值,需将字符串 v13 中的值两个一组,当作16进制的值,换算成ASCII 码并转成对应的字符即可。得到的结果即为 flag,也是要输入的内容。

Flag值计算

上面已经分析了如何获取 Flag 的思路了,下面通过几种方式来计算。

1、Python 代码计算:

# encoding: utf-8
x='437261636b4d654a757374466f7246756e' 
y='' 
i=0
while(i<len(x)):
    y+=chr(int(x[i:i+2],16))
    i+=2
print(y)

在线运行结果如下(获得 flag:CrackMeJustForFun):
在这里插入图片描述执行程序进行 Flag 验证:
在这里插入图片描述

2、在线工具自动转换:

在这里插入图片描述

总结

关于 IDA Pro 的基础学习,请参考以下文章:

  1. 杨秀璋:网络安全自学篇(五)| IDA Pro反汇编工具初识及逆向工程解密实战
  2. CS基础:ida的基本使用教程(1) ;
  3. IDA Pro 破解版下载:IDA Pro 7.5 绿色版(2021.01.28更新)
### 攻防世界 PWN 类别 IDA 题目解法 #### 函数 `locker` 的分析 函数 `locker` 存在一个明显的缓冲区溢出漏洞,该漏洞允许攻击者通过控制输入来覆盖栈上的返回地址或其他重要数据结构。具体来说,在调用 `fgets(s, 512, stdin)` 后,程序会将用户输入传递给 `imagemagic(s)` 处理[^3]。 由于 `s` 数组大小为 520 字节而只读入了最多 512 字节的数据,因此当输入长度接近或等于这个上限时就可能发生越界写操作。如果能够精心构造输入使得其恰好能覆盖掉保存在栈中的某些关键变量(比如返回地址),就可以实现任意代码执行的效果。 #### 缓冲区溢出利用方法 对于此类简单未加防护措施的目标二进制文件而言,最直接有效的攻击方式就是基于堆栈的缓冲区溢出来获取 shell 控制权: - **确定偏移量**:先找出从开始位置到目标指针之间的字节数差值; - **构建 payload**:创建一个由 NOP sled 加上 shellcode 组成的有效载荷; - **绕过检查机制**:如果有任何形式的安全检测存在,则需找到办法规避它们的影响;不过本案例中似乎并不存在这样的障碍。 ```python from pwn import * # 假设已知 offset 和 target address offset = ... # 计算得出的具体数值 target_addr = ... payload = b'A' * offset + pack(target_addr) process('./vuln').sendline(payload) ``` #### Unsorted Bin Attack 方法简介 另一种可能适用的技术叫做 unsorted bin attack,它主要针对动态内存分配器 glibc malloc 中管理 free chunks 所使用的双向链表特性来进行攻击。在这种情况下,可以通过泄露 libc 地址或者伪造 chunk 结构体的方式达到重定向程序流的目的[^2]。 然而需要注意的是这种方法通常适用于更复杂的应用场景下,并不是解决当前题目最优选之一。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tr0e

分享不易,望多鼓励~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值