0.前言
这个例题似乎是没法完成最终的getshell的,因为缓冲区离got表太近了,会出问题。
1.思路
当程序开了PIE或者ASLR保护后,函数的地址会被随机化,这时如果要返回到某个函数的话就需要泄露地址。
以开了ASLR的为例,此时系统函数的地址是随机的,但是函数在同一libc中的偏移量是确定的。而我们知道,一个系统函数,如puts函数,在程序中被调用过后,其地址就会存在got表中,此时可以通过泄露其地址,再通过偏移即可泄露libc的基地址。此时如果要调用system或execv函数,则再用libc基地址加上对应的偏移即可。
2.例子
例题文件:点击下载
前略。
可以看出,总体的逻辑和之前的advanced差不多,通过栈溢出覆盖返回地址到global_buf,实行栈转移。由于开了NX保护,所以无法通过shellcode的方法。
这题不同的是需要先进行地址泄露,脚本的逻辑如下:
1 | payload1=b'A'*80+p64(global_buf_addr)+p64(leave_ret) #栈转移 |
之后再构建rop即可getshell。(由于题目本身问题,故没有成功。)
3.小结
地址泄露的原理很简单,首先要泄露某个函数的地址,根据固定的偏移量计算基地址位置,再根据偏移计算你要调用函数的地址。
需要注意的是libc版本的选择一定要正确。因为不同的libc同一函数的偏移量都是不一样的。