完成了level1,现在来看看level2.
这是讲义上touch2函数
void touch2(unsigned val)
{
vlevel = 2; /* Part of validation protocol */
if (val == cookie) {
printf("Touch2!: You called touch2(0x%.8x)\n", val);
validate(2);
}
else {
printf("Misfire: You called touch2(0x%.8x)\n", val);
fail(2);
}
exit(0);
}
touch2函数有个形参,大概意思是这个参数与cookie相等就pass,这个比level1的难点在于多了个参数,并且等于一个值(cookie.txt中的值)。
下边给的建议,大体意思是还是更改getbuf的返回地址到touch2,然后第一个参数是在rdi中,不要调用call和jmp
考虑到这也算是个栈溢出的问题,先确定个缓冲区,而getbuf是输入,这时我们想把getbuf这一栈帧作为存储shellcode的缓冲区,而返回地址选择为rsp栈顶,因getbuf本就是从栈顶开始输入存储。
画个图
大致这个意思,只不过shellcode得自己写了,写出汇编代码,然后汇编成机器码,在借助hex2raw把机器码转换成字节码。
就像这样(我有个问题,不知道为什么我用inter格式写然后汇编它报错,无奈用at&t格式)
第1行是rdi等于cookie。
第2行是touc2的地址。
然后汇编
反汇编 得到指令的机器码
所以现在编写攻击脚本,这些指令共13个字节,和level1一样要凑40个字节,剩下的按00凑,然后得确定rsp的地址。
所以gdb调试一下
我输入了abcd,然后查看栈帧情况
没错地址为0x5561dc78.
所有东西都备齐了,开始写攻击代码
然后利用hex2raw进行攻击
成功!