实验内容及操作步骤:
一、实验基本内容:
二进制炸弹是作为一个目标代码文件,运行时会提示用户输入6个不同的字符串,如果其中任何一个不正确,炸弹就会爆炸,打印出一条错误信息。我们需要通过反汇编和逆向工程来确定是哪六个字符串,以此来破解炸弹的密码。六个密码分别存在与phase_1、phase_2、phase_3、phase_4、phase_5和phase_6中,需要对给出的可执行文件bomb进行反汇编,得到反汇编代码后再进行破译,最好是得到其对应的c语言代码。
二、实验操作:
将文件夹bomb08010208放到linux虚拟机中,然后在该文件夹下打开终端:
然后通过objdump -d bomb >bomb.asm获得相应的asm文件
再在终端中输入gdb -tui -q bomb对bomb可执行文件进行调试,在调试界面输入layout asm打开asm汇编语言文件,然后开始破解
1、对phase_1破解:
可以得到phase_1的汇编语言代码,开始破译
sub $0x1c,%espmovl $0x804a244,0x4(%esp)mov 0x20(%esp),%eaxmov %eax,(%esp)call 0x8049064 <strings_not_equal>test %eax,%eaxje0x8048b70 <phase_1+32>call 0x8049176 <explode_bomb>add $0x1c,%espret
分析后得到:第一个密码函数是要我们输入一个字符串,然后和文件中的字符串进行比较(调用strings_not_equal函数),如果相等则不会引爆炸弹(je指令),如果不相等则会进行引爆。只需要查找0x4(%esp)位置的数值就可以得到正确的密码,正确的密码为:Houses will begat jobs, jobs will begat houses.
具体操作为:在phase_1处放置一个节点,然后单步运行到执行strings_not_equal函数之前,然后通过x/s指令单独查看0x(%esp)和0x20(%esp)处的数据值。
对应的编程语言代码为:
string a=”Houses will begat jobs, jobs will begat houses.”;string b=”0”;cin>>b;if(a!=b)explode_bomb;