二进制炸弹实验 BinaryBombs

实验介绍

  • 使用所学知识拆除Binary Bombs来增强对程序的机器级表示、汇编语言、调试器和逆向工程等理解 。
  • Binary Bombs(二进制炸弹)是一个可执行程序,是C语言编译链接成的,包含phase1~phase6共6个阶段(还有隐藏阶段) 。
  • 各阶段要求输入一个答案,若正确,该阶段炸弹被拆除,否则爆炸 。
  • 你需要拆除尽可能多的炸弹
  • 实验提供一个bomb.c和bomb可执行文件,但是,bomb.c中只有主函数,和一些彩蛋 。
  • bomb有一个命令行参数,为读入的文件 。所以你可以将答案写入到一个txt文件,每个答案一行 。
实验技巧gdb调试
  • (gdb)info reg查看所有寄存器的信息
  • (gdb)info frame查看栈的信息
  • (gdb)b * 0x405040在0x405040处设置断点
  • (gdb)b phase_1在函数phase_1处设置断点
  • (gdb)x/2s 0x405010输出0x405010开始的两个字符串
  • (gdb)stepi执行一条指令
  • (gdb)nexti类似于stepi,但以函数调用为单位
  • 【二进制炸弹实验 BinaryBombs】(gdb)c继续(遇到断点后)
  • (gdb)run ans.txt命令行参数运行
  • (gdb)q退出
  • (gdb)finish运行到当前函数返回
  • (gdb)delete删除所有断点
  • (gdb)delete 5删除断点 5
  • (gdb)layout asm展示当前的汇编语言(非常的好用,ctrl + L 刷新)
  • (gdb)p *(int *) 0x405012输出位于地址0x405012的整数
  • (gdb)p $rax输出%rax的值
  • (gdb)p /x $rax以十六进制输出%rax的值
  • (gdb)p *(int *)($rbp + 0x8)输出地址%rbp + 0x8的整数
  • (gdb)disas phase_1反汇编phase_1函数
我的实验经验
  • 先反汇编objdump -d bomb > asm.txt 。然后把asm.txt的内容复制粘贴到word 。用word来看汇编语言,方便涂色标注
  • 一边分析汇编语言,一边利用gdb调试 。
  • 先熟读CSAPP第三章,最好把习题做完
phase_1密码如下:I am not part of the problem. I am a Republican.破解过程:
二进制炸弹实验 BinaryBombs

文章插图
  1. 在phase_1函数处设置断点 。
  2. 随便输出一个答案,如 abcdef 。
  3. 观察断点信息,input_strings可知,答案确实是一个字符串 。
  4. 反汇编观察到 strings_not_equal,推测是在判断字符串是否相等 。然后,test命令测试返回值,如果非0,则爆炸 。
  5. 0为真,1为假,那么非0对于strings_not_equal,应该是字符串不等,所以现在要找到那个与输出的字符串匹配的字符串 。
  6. 观察到,传递给寄存器%esi的值0x403150
  7. 打印此处的字符串: x/2s 0x403150
  8. 得到答案
汇编代码:
点击查看代码00000000004013f9 <phase_1>:  4013f9: 55                    push   %rbp  4013fa: 48 89 e5              mov    %rsp,%rbp  4013fd: be 50 31 40 00        mov    $0x403150,%esi  401402: e8 3d 04 00 00        callq  401844 <strings_not_equal>  401407: 85 c0                 test   %eax,%eax  401409: 75 02                 jne    40140d <phase_1+0x14>  40140b: 5d                    pop    %rbp  40140c: c3                    retq  40140d: e8 2e 05 00 00        callq  401940 <explode_bomb>  401412: eb f7                 jmp    40140b <phase_1+0x12>****

经验总结扩展阅读