写在前面,4月24号,微软实习三面失败后,决定继续发奋图强,写在这里给自己一个警醒,也希望以后能更技术能越来越好,以前的博客质量上可能还有欠缺,将在以后的时间里重新编辑
准备工作
1.环境准备
有docker下载我准备好的实验镜像
docker pull liutianhao/csapp_bomb
没有docker请确保有gdb和gcc等工具
2.文件准备
前面的博客里有提到这里在写下地址
准备就绪后进入正题
打开文件应该包含一下文件
其中bomb是可以执行的二进制文件。bomb.c是协助的源文件
我们打开bomb.c可以看见phase_1函数想要通过要先从它入手
执行下列代码进入phase_1的内容
1.gdb bomb
2.disas phase_1
看见如下内容
我们打开bomb.c看到phase_1的第一个参数是input
得到信息 1.输入放在寄存器rdi中
然后看phase1的汇编代码看见首先栈开了缓冲区
然后把什么奇怪的东西放进入 esi中
接着调用strings_not_equal函数
可以猜测 应该是把第一个参数中的input与 esi中的比较但是我们还不能确定
disas strings_not_equal中看下
看到两个 rdi和rsi 也就是第一个参数和第二个参数都被放入寄存器中
然后string_length先求第一个参数的长度
然后求第二参数的长度
然后比较长度 不想等返回0
然后遍历比较
看完后就知道我们只要知道什么东西塞进esi中便可以轻松过了第一个关
因为已经知道是字符串所以依靠gdb
p (char*)0x402400
然后推出gdb
./bomb
输入Border relations with Canada have never been better.