实验原理与目的
上一篇以及介绍了实验原理,就是程序在编译时会加入一些通用函数来进行初始化操作,我们可以针对初始化函数来提取一些通用的gadget,通过泄露某个在libc中的内容在内存中的实际地址,通过计算偏移量来得到system和bin/sh的地址,然后利用返回指令ret连接代码,最终getshell。然而本次实验比较巧妙的地方就是利用了leave指令。
leave|ret
leave指令其实是两个指令合在一起的指令,即
mov rsp,rbp
pop rbp
也就是说我们可以利用这条指令,通过修改rbp,来修改rsp。换句话说就是改变栈上上一级函数的栈基址来修改rbp,再通过mov rsp,rbp来修改rsp,从而使程序继续执行我们想要跳到地址。所以本次实验需要先泄露rbp内的地址,算出偏移量,得到目标地址,然后构造payload。
实验步骤
chechsec命令检查是否有canary保护
图中显示并没有,如果有的话,就先进行泄露。
IDA反汇编
__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
setvbuf(stdin, 0LL, 2, 0LL);
setvbuf(stdout, 0LL, 2, 0LL);
while ( sub_400676() )
;
return 0LL;
}
通过看源代码可能看出这是一个无限循环,我们来看一下sub_400676()
int sub_400676()
{
c