CTF-All-In-One 项目解析:DefcampCTF2015 entry_language 逆向挑战
CTF-All-In-One CTF竞赛权威指南 项目地址: https://gitcode.com/gh_mirrors/ct/CTF-All-In-One
题目概述
entry_language 是 Defcamp CTF 2015 的一道逆向工程题目,属于典型的密码验证类挑战。题目提供了一个 ELF 64 位可执行文件,要求参赛者通过逆向分析找到正确的密码。
文件分析
首先我们检查文件基本信息:
$ file entry_language
entry_language: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=0f464824cc8ee321ef9a80a799c70b1b6aec8168, stripped
这是一个去除了符号表的 64 位 ELF 可执行文件,运行时会提示用户输入密码:
$ ./entry_language
Enter the password: test
Incorrect password!
传统逆向分析方法
主函数分析
使用逆向工具分析主函数,可以看到程序的主要逻辑:
- 打印提示信息"Enter the password: "
- 使用fgets获取用户输入
- 调用验证函数检查密码
- 根据验证结果输出"Nice!"或"Incorrect password!"
关键验证函数
验证函数位于0x004006fd,其核心逻辑可以简化为以下伪代码:
int verify(char *input) {
char *str_1 = "Dufhbmf";
char *str_2 = "pG`imos";
char *str_3 = "ewUglpt";
for (int i = 0; i <= 11; i++) {
int index = i % 3;
int offset = 2 * (i / 3);
if (str[index][offset] - input[i] != 1) {
return 1; // 验证失败
}
}
return 0; // 验证成功
}
密码生成算法
通过分析验证逻辑,我们可以逆向推导出密码生成算法:
- 密码长度为12个字符
- 使用三个固定字符串作为基础:"Dufhbmf"、"pG`imos"、"ewUglpt"
- 每个字符的生成规则:从对应字符串的特定位置取字符,然后将其ASCII值减1
实现代码如下:
str_list = ["Dufhbmf", "pG`imos", "ewUglpt"]
password = []
for i in range(12):
# 计算使用哪个字符串
str_index = i % 3
# 计算字符串中的偏移量
char_offset = 2 * (i // 3)
# 获取字符并减1
password.append(chr(ord(str_list[str_index][char_offset]) - 1))
print(''.join(password))
运行后将得到正确密码:"Code_Talkers"
使用Angr自动化分析
传统逆向方法需要理解算法逻辑,而使用符号执行工具Angr可以更高效地解决问题,无需深入分析验证逻辑。
Angr解决方案
import angr
# 加载二进制文件
project = angr.Project("entry_language", auto_load_libs=False)
# 定义hook函数,在验证成功的位置打印输入
@project.hook(0x400844)
def print_flag(state):
print("FLAG SHOULD BE:", state.posix.dump_fd(0))
project.terminate_execution()
# 开始执行
project.execute()
Angr工作原理
- 创建项目对象,加载二进制文件
- 在验证成功的位置(0x400844)设置hook
- 当执行流到达该位置时,打印此时的输入内容
- 终止执行
Angr会自动探索可能的执行路径,找到能够到达目标地址的输入,大大简化了逆向过程。
技术要点总结
- 逆向分析基础:理解程序的控制流和数据流是逆向工程的核心
- 算法逆向:通过分析验证逻辑,推导出密码生成算法
- 符号执行:使用Angr等工具可以自动化路径探索,特别适合解决这类验证问题
- 效率对比:传统方法需要深入理解算法,而符号执行工具可以"暴力"解决问题
扩展思考
- 如何加强这类密码验证程序的防护,使其难以被逆向?
- 符号执行工具的局限性是什么?在什么情况下传统逆向方法更有效?
- 在实际CTF比赛中,如何根据题目特点选择最合适的解题方法?
这道题目展示了逆向工程中两种不同的解题思路,对于初学者理解逆向分析和自动化工具的使用都有很好的示范作用。
CTF-All-In-One CTF竞赛权威指南 项目地址: https://gitcode.com/gh_mirrors/ct/CTF-All-In-One
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考