bomblab一共有六关,每一关都需要输入正确的密码
首先打开bomb.c文件,看到main函数主要有6个phase,每一关大概都是这样的:
input = read_line(); /* Get input */
phase_1(input); /* Run the phase */
phase_defused(); /* Drat! They figured it out!
* Let me know how they did it. */
printf("Phase 1 defused. How about the next one?\n");
也就是需要给一个输入,如果输入符合某些要求,就能够通过。那么我们怎么样找到通关的密码呢?那就需要我们反汇编bomb,从汇编代码中探索啦。
第一关:
重点:gdb的基本操作与函数传参
gdb bomb进入gdb,在phase_1函数的入口打上断点,然后运行程序。需要输入一个密码,我们就先随便输入一个。
到达phase_1断点后,用disas命令进行反汇编,就能看到phase_1函数的汇编代码啦。
分析这段汇编代码,首先,sub $0x8,%rsp 显然是分配了phase_1的栈帧(stack frame),大小为8个字节。
接着在call指令转移到函数<strings_not_equal>之前设置了寄存器%rsi。回忆一下函数的参数传递,前6个参数由寄存器%rdi,%rsi,%rdx,%rcx,%r8,%r9,超出6个的参数通过栈来传递。%rsi对应着第2个参数,是一个立即数,那么第一个参数%rdi中的内容是什么呢?
因为在phase_1中,我们没有改变%rdi,那么此时%rdi仍旧是调用phase_1的函数(main函数)传给phase_1的第一个参数。我们看一下bomb.c,可以发现这个参数是我们的输入。
input = read_line(); /* Get input */
phase_1(input); /* Run the phase */
phase_defused(); /* Drat! They figured it out!
分析到这里,我们可以知道phase_1调用了<strings_not_equal>,并把input作为第一个参数,0x401338 作为第二个参数传给了<strings_not_equal>。
stepi 3,继续运行3步,能够进入<strings_not_equal>,disas反汇编。同理,分析可知这个函数的功能是判断两个字符串是否相同,相同则返回1。
之后回到<phase_1>,还有这么几行
test %eax,%eax
je 0x400ef7 <phase_1