在网上关于这个的实验有几个版本,这个版本只有三关,都比较基础,为了不让大家混淆,对本实验做一下说明:
文件说明
1. bufbomb : 主程序,有四个选项,最常用的是 -t ,后面加自己的姓名等,运行时会根据加入的参数生成cookie,第二关和第三关都会用到。
2. sendstring : 翻译程序,实验要求将字符转化成ascii码输入,两位输入,即想输入0也要输入00,1对应01,以此类推。可以通过 sendstring < exploit.txt > exploit_raw..txt 将翻译结果输入到 exploit_raw.txt 文件中。一般如果输入的文件中有地址时都尽量不要打开输出文件,里面会有一些无法显示的字符,尽量用管道或者重定位来进行输入。gdb下可以提通过重定位将 exploit_raw.txt 文件中的内容作为输入,例如 : run -t pangjingyu < exploit_raw.txt
3. makecookie: 根据输入的字符串输出唯一的cookie,作为标识,bufbomb中含有此程序。以 -t 选项运行bufbomb时要求输入标识,会自动生成并显示对应的cookie。
关卡说明
1 getbuf()返回时,不返回到test(),而是直接返回到指定的smoke()函数。
2 getbuf()返回时,不返回到test(),而是直接返回到指定的fizz()函数,而且要求给fizz()函数传入一个黑客cookie值作为参数。
3 getbuf()返回时,不返回到test(),而是直接返回到指定的bang()函数,并且在返回到band()之前,先修改全局变量global_value为你的黑客cookie值。
关卡1
思路
解决步骤
1. 首先观察getbuf()和gets(),save_char()函数。第一关只涉及这三个函数,整理其调用顺序是:getbuf() -> gets()-> save_char()。
2. 观察getbuf()函数:
图1 getbuf()函数
图2 gdb设置断点并输入参数运行
通过单步执行可以得到如下栈数据:
图3 观察栈参数
图4 返回地址和栈参数
根据图3和4可以的到在进入Gets()前 栈的参数设置如图: