写在前面
在前篇《CS:APP二进制炸弹前奏》中了解了bomb程序的整体结构,以及需要完成6个阶段才能成功“拆掉”炸弹!本篇就来试着“攻破”第一关。let's go!!!
分析
先在gdb中反汇编程序,找到调用phase_1函数的片段如下:
先调用read_line获取输入,结果存储在寄存器%rax中,调用phase_1之前,又将结果存在了寄存器%rdi中。OK,现在%rdi中存储的就是我们输入字符串的首地址。
接着反汇编函数phase_1:
可以看到函数phase_1很简单,没几行代码。通过调用函数strings_not_equal来判断输入字符串与目标字符串是否相等来决定是否“引爆”炸弹 -- 即调用函数explode_bomb。
可以断定函数strings_not_equal需要两个参数,类型都是const char *类型。在调用它之前通过寄存器%esi来传入目标字符串,那现在就很简单了,通过x命令查看这个地址处的字符串即可!
从输出的结果就得到了这个phase的答案!
阶段一返回C源码应该如下:
// 返回0 -- input == dst; 返回1 input != dst
int strings_not_equal(const char *input, const char *dst)
{
int result;
size_t len1 = strlen(input);
size_t len2 = strlen(dst);
if (len1 != len2) {
result = 1;
} else if (input[0] == '\0') {
result = 0;
} else {
result = 1;
while (*input++ == *dst++) {
if (*input == '\0') {
result = 0;
break;
}
}
}
return (result);
}
int phase_1(const char *input)
{
const char *dst = "Border relations with Canada have never been better.";
int result = strings_not_equal(input, dst);
if (result != 0) {
explode_bomb();
}
return (result);
}
总结
第一个phase_1非常简答,几乎不费什么力气,继续第二个phase_2吧!