Lab1-Rev Report¶
📖 阅读信息
阅读时间:1 分钟 | 中文字符:262 | 有效代码行数:21
Task 1¶
Case 1:gcc+as¶


编译与汇编均成功。
Case 2:gcc+llvm-mc¶

编译同上,汇编成功。
Case 3:clang+as¶


编译成功,汇编失败。这其中的原因在于 Clang 默认使用的是 AT&T 汇编语言语法,而 as 期望的是 Intel 语法,这样就产生了上图的 errors:unknown...
Case 4:clang+llvm-mc¶

编译同上,汇编成功。
Task 2¶
拿到 elf,毫不犹豫直接丢进 IDA 反汇编,可以看到入口函数 _start 的结构:

其伪代码如下:

这里没有什么关键信息,但是我们发现 IDA 有显示一堆奇奇怪怪的字符串:

一个个点开,拼起来我们就直接得到 flag 了?!(也太快了吧)

最后拼接成的 flag 为:AAA{hope_u_have_fun~}
Task 3¶
将 challenge2.bc 文件使用命令行 clang challenge2.bc -o challenge2 进行编译,将生成的 elf 放进 IDA 中反汇编。
其主程序如下:

根据这里,我们发现需要一个重要的数组:target,用于检测,我们翻找发现 target 数组:

此外,还有一个函数 xcrc32 也需要我们寻找,其程序如下:

这其中还有一个 crc32_table,查找可得:

注意到 xcrc 这个函数,我们关注 a3 的末 8 位,当 a3 << 8 时整体的末 8 位均为 0,那么执行一次赋值操作就将 crc32_table 中某个元素的末八位给 a3。
而且根据~观察~大胆猜测 crc32_table 每个元素的末 8 位不同,可以知道执行操作的 crc_table 元素的完整数据,那么根据异或操作 a ^ b = c 可推出 b = a ^ c ,即可获得前一次操作 a3 << 8 的值。
将 a3 右移八位,同之前的道理,还是可以得到最初的 crc_table 元素的完整数据,此时我们也知道初始的 a3 为 0x414243 ,那么异或一下我们就可以得到中间算出的 a3 完整数据,这样对应的字符也就迎刃而解了!(撒花!)
编写 Python 程序如下:
最后得到 flag:

💬 评论
评论系统加载中...