[SWPUCTF 2022 新生赛]babyre

piter 发布于 14 天前 403 次阅读 1019 字


[SWPUCTF 2022 新生赛]babyre

[!IMPORTANT]

本题考点:逆向入门,用 IDA 查看伪代码和字符串。这是我做的第一道逆向题,顺便把 IDA 的基本用法记下来。

解题过程

将题目给的文件下载解压后,使用 IDA 打开,按 F5 查看 main 函数的伪代码,flag 就明文写在 printf 里:

NSSCTF{this_is_the_first_flag}

[!NOTE]

为什么能直接看到 flag? C 源码里的字符串常量,编译成 exe 之后还是原样存在程序文件里。所以不管是看伪代码,还是用 Shift+F12 打开字符串窗口,都能直接看到它。后面的题目一般会把 flag 加密、拆开或者藏在校验逻辑里,就得真正读懂代码了。

逆向是什么

逆向就是拿到一个编译好的程序(比如 exe、ELF),在没有源码的情况下弄清楚它在干什么。CTF 里的逆向题通常是这样:程序让你输入一串东西,经过一番处理之后和某个值比较,比较通过就说明你输入的是 flag。我们要做的是读懂这个处理过程,再把 flag 反推出来。

拿到题目先做什么

  1. 看文件类型:是 Windows 的 exe 还是 Linux 的 ELF,32 位还是 64 位。可以用 Detect It Easy(DIE) 拖进去看,它还能顺便告诉你程序有没有加壳(加了壳要先脱壳,IDA 才能看清楚)。
  2. 跑一下(在虚拟机里更安全):看看程序输出什么、要你输入什么,心里先有个数。
  3. 用 IDA 打开:64 位程序用 64 位版本打开(新版 IDA 已经合并成一个程序)。

IDA 界面

打开程序、等左下角的自动分析跑完(状态栏显示 idle)以后,主要有这几块:

  • Functions(函数列表):左边,程序里所有的函数。入门题直接找 main。
  • IDA View:汇编视图,按 空格 在流程图和纯文本之间切换。
  • Pseudocode:按 F5 生成的伪代码,长得很像 C,入门最常看的就是它。
  • Strings:字符串窗口,Shift+F12 打开。
  • Hex View:十六进制视图,直接看原始字节。
  • Imports / Exports:程序调用了哪些系统函数,导出了哪些函数。比如看到 strcmp、memcmp,就能猜到程序在做比较。

常用快捷键

快捷键 作用
F5 把当前函数反编译成伪代码
Tab 在汇编和伪代码之间来回切
Shift+F12 打开字符串窗口
空格 汇编视图里切换流程图 / 文本
双击 跳转到函数、变量或字符串的位置
Esc 跳回上一个位置(像浏览器的后退)
X 查看交叉引用:谁调用了这个函数 / 谁用了这个字符串
G 跳转到指定地址或函数名
N 重命名变量或函数(读懂一个就改个好记的名字)
Y 修改变量类型
/ 在伪代码里加注释(汇编里用 ;)
H 数字在十进制和十六进制之间切换
R 把数字显示成字符,比如 0x41 变成 'A'
Shift+E 把选中的数据导出(比如导出一整段加密后的数组)

入门逆向的常见套路

  1. 先看字符串:Shift+F12,找 flag、NSSCTF{、right、wrong、correct、Input 这类字符串。
  2. 从字符串顺藤摸瓜:双击跳到字符串,按 X 看是哪个函数用了它,一般就能找到关键的判断逻辑。
  3. 看 main 的伪代码:F5,重点关注输入(scanf、gets)、处理(循环、异或、加减)、比较(strcmp、if)这三部分。
  4. 边读边改名:用 N 把 v1、v2 这类变量改成 input、key,代码会越读越清楚。
  5. 把逻辑反过来:比如程序做的是 input[i] ^ 0x12 == enc[i],那 flag 就是 enc[i] ^ 0x12,写个小脚本跑一下就出来了。

参考资料

  • reward_image1
永远不要因为需要大量时间才能完成,就放弃梦想,时间怎么样都会过去的
最后更新于 2026-10-08