想说一下,由于明天要中期答辩,再加上我们专业搞的工程认证项目,所以这次检查极为严格。其实之前已经准备的差不多了,但好无奈今天又一堆通知文件发下来,劈头盖脸地又是一通填,一通改,还要签字盖章,心态崩了。所以今天并没有怎么学习测试内容,只是抽空简单看了一下第二阶段的内容。
二进制拆弹
题目描述
第二阶段的主要内容是逆向工程拆除二进制炸弹,总共有6个阶段,炸弹运行各阶段要求输入一个字符串,若输入符合程序预期,该阶段炸弹被拆除,否则爆炸。
文件
题目文件包含两个文件:bomb的可执行文件和bomb.c
使用工具
objdump工具
objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它还有其他作用,下面以ELF格式可执行文件test为例详细介绍:
objdump -f test
显示test的文件头信息
objdump -d test
反汇编test中的需要执行指令的那些section
objdump -D test
与-d类似,但反汇编test中的所有section
objdump -h test
显示test的Section Header信息
objdump -x test
显示test的全部Header信息
objdump -s test
除了显示test的全部Header信息,还显示他们对应的十六进制文件代码
gdb调试器
一般来说,GDB主要帮助你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
gdb最常见的几个用法:
- 调试程序。有几种方法可以在gdb下运行你的程序:
1) gdb ${你的程序} 进入gdb后,输入run(简写r) ${arg1} ${arg2} … ${argN} 2) gdb --args ${你的程序} ${arg1} ${arg2} … ${argN} 进入gdb后,运行run。 3) gdb进入gdb后,输入file ${你的程序}。然后使用set args ${arg1} ${arg2} … ${argN} 设定好你的程序参数,再运行run。
- 调试正在运行的程序:
gdb ${你的程序} ${程序pid}
- 查core:
gdb ${你的程序} ${core文件}
gdb常用命令:
1. backtrace:显示栈信息。简写为bt。
2. frame x 切换到第x帧。其中x会在bt命令中显示,从0开始。0表示栈顶。简写为f。
3. up/down x 往栈顶/栈底移动x帧。当不输入x时,默认为1。
4. print x打印x的信息,x可以是变量,也可以是对象或者数组。简写为p。
5. print */&x 打印x的内容/地址。
6. call 调用函数。注意此命令需要一个正在运行的程序。
查看bomb程序的汇编代码
输入命令 objdump -d bomb>aaa.txt
得到