1. 逆向工程实战:从汇编代码到Flag获取
最近在GHCTF 2024新生赛中遇到一道有趣的逆向题目,题目给出了一个AT&T格式的汇编代码片段。作为逆向工程爱好者,我决定详细记录下解题过程,分享给同样对逆向感兴趣的朋友们。
这道题目的核心是一个简单的flag验证程序,通过分析汇编代码我们可以还原出原始flag。整个过程涉及到AT&T汇编语法解析、关键算法识别和Python脚本编写等环节。下面我会详细讲解每个步骤的实现原理和具体操作。
注意:本文假设读者已经具备基础的汇编语言知识和Python编程能力。如果对某些概念不熟悉,建议先补充相关基础知识。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. AT&T汇编语法解析
2.1 AT&T与Intel语法对比
在开始分析之前,我们需要先了解AT&T汇编语法的特点。AT&T语法与常见的Intel语法有几个关键区别:
-
操作数顺序相反:在Intel语法中是
mov eax, 10,而在AT&T语法中则是movl $10, %eax。AT&T语法中目标操作数在右边,源操作数在左边。 -
寄存器与立即数表示:AT&T语法中寄存器名前要加
%符号,立即数前要加$符号。例如movl $100, %eax表示将立即数100移动到eax寄存器。 -
内存引用表示:Intel语法中的
[ebp-36]在AT&T语法中表示为-36(%ebp)。这种表示法更直观地体现了"基址+偏移"的内存访问方式。
2.2 题目中的关键汇编片段
题目给出的汇编代码中,有几个关键部分需要我们重点关注:
assembly复制movl $100, -36(%ebp) # 将100存储到ebp-36的位置
leal -86(%ebp), %edx # 将ebp-86的地址加载到edx寄存器
movl -32(%ebp), %eax # 将ebp-32的值加载到eax
addl %edx, %eax # 将edx和eax相加
movzbl (%eax), %edx # 从eax指向的内存读取一个字节到edx
movl -36(%ebp), %eax # 将ebp-36的值(100)加载到eax
movl %edx, %ecx
