[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 反推出来。
拿到题目先做什么
- 看文件类型:是 Windows 的 exe 还是 Linux 的 ELF,32 位还是 64 位。可以用 Detect It Easy(DIE) 拖进去看,它还能顺便告诉你程序有没有加壳(加了壳要先脱壳,IDA 才能看清楚)。
- 跑一下(在虚拟机里更安全):看看程序输出什么、要你输入什么,心里先有个数。
- 用 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 |
把选中的数据导出(比如导出一整段加密后的数组) |
入门逆向的常见套路
- 先看字符串:
Shift+F12,找flag、NSSCTF{、right、wrong、correct、Input这类字符串。 - 从字符串顺藤摸瓜:双击跳到字符串,按
X看是哪个函数用了它,一般就能找到关键的判断逻辑。 - 看
main的伪代码:F5,重点关注输入(scanf、gets)、处理(循环、异或、加减)、比较(strcmp、if)这三部分。 - 边读边改名:用
N把v1、v2这类变量改成input、key,代码会越读越清楚。 - 把逻辑反过来:比如程序做的是
input[i] ^ 0x12 == enc[i],那 flag 就是enc[i] ^ 0x12,写个小脚本跑一下就出来了。


Comments NOTHING