前情提要:因为图片都很长的原因,up不会调,所以可能看的不舒服,请原谅up,电脑可以缩小至80或者90看会舒服一点,实在抱歉了
实验原理:
本次实验用到的基本上是缓冲区越界,学过c语言的可以将他类比为数组越界,原本数组开了10个int大小,但是我们给他输入了15个数字,那多出来5个数字就覆盖掉了别的位置的数。
一个例子:
我们要执行一个函数会向下开辟空间,就是红色区域。然后这个函数执行完会ret返回就是return到开辟之前的空间,就是第一个rsp的位置,然后执行那里的地址的代码。
test函数是1-5题都要接触到的
getbuf执行完rsp会回到上图rsp的位置
phase_1
任务内容:
本关任务:本关需要做的是劫持程序流,将函数的正常返回地址重写,使函数重定向到指定的函数。 本关要求重定向到touch1
函数。
getbuf函数
getbuf函数开辟40个字节,然后test的rsp里面存的是地址有8个字节,存的是函数的地址且用小端法表示
所以我们要填充完40个字节的空间,然后让他溢出填充多8个字节的空间,把之前一个函数的地址覆盖成touch1的地址
用disas touch1 查询touch1的地址是0x4017c0,小端法表示:c0 17 40 00 00 00 00 00
所以答案是:
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 这里面40个00都是用来填充前面getbuf的40个bits的空间的
c0 17 40 00 00 00 00 00 让rsp指向的函数地址变成touch1的
演示一遍如何输入答案,因为要用文本输入:
创建一个 1.txt文本存16进制数
然后按 i 进入编辑模式
输入进去,有空格尽量不要有换行
然后esc :wq 冒号然后输入wq保存文档
转换为机器可以识别的机器码存进2.txt文档里
然后将这个2.txt文本作为参数传入ctarget里
任务完成了,成功唤醒了touch1函数
phase_2
任务内容:
本关任务依然是在调用getbuf函数后不返回test函数,而是执行touch2函数。但是需要传入一个unsigned类型的参数,且该参数值与cookie值一致才能通关。 提示:此cookie值存放于文件cookie.txt中,值为0x59b997fa
tips:本关任务:与第一关不同,本关需要做的是在输入字符串中注入一小段代码。 其实整体的流程还是getbuf
中输入字符,然后拦截程序流,跳转到调用touch2
函数
思路:
我们需要唤醒touch2函数的时候并且传参进去。已知我们只用传一个参数进去,所以那个参数在的位置是 %rdi 寄存器
那我们如何执行我们存进去的代码呢?执行的顺序是什么?
1.我们知道传参进 %rdi 一定是调用touch2函数之前,所以我们需要的代码是
movq $0x59b997fa, %rdi ///传cookie的值给%rdi
pushq $0x4017ec ///将touch2函数压栈,然后ret就可以调用touch2函数
ret /// 0x4017ec是touch2的地址
所以栈情况长这样:
分析这个是如何执行的我们就知道为什么要这样放栈了
然后大家就可以理解代码插入哪里,还有为什么 rsp2 的地址不像第一题是直接指向touch2,而是要指向我们插入的代码了吧
然后我们就可以知道我们要填入什么东西了
1.我们要填入我们代码的机器码
2.然后补齐加入机器码之后的剩余空间
3.然后溢出的部分,就是执行完getbuf后会调用的函数地址要是我们插入的代码的地址了吧(插入的代码地址其实就是我们从rsp1的栈顶开始插入的,所以我们知道rsp1的地址就行了)
然后怎么把汇编代码变成机器码:
我们需要的代码转换后:
0: 48 c7 c7 fa 97 b9 59 mov $0x59b997fa,%rdi
7: 68 ec 17 40 00 pushq $0x4017ec
c: c3 retq
所以我们需要的十六进制是:
48 c7 c7 fa 97 b9 59 68 ///给%rdi赋值
ec 17 40 00 c3 00 00 00 ///touch2函数压栈
00 00 00 00 00 00 00 00 ///c3是ret,调用touch2函数
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
78 dc 61 55 00 00 00 00 ///这里的地址是rsp1的地址,就是getbuf的栈顶,建议回归上面的图
///指向插入代码的地址执行这些代码
然后按照前面的方式提交将16进制转换后的机器码的文本作为参数就好了