- 修改返回地址,让其指向溢出数据中的一段指令(shellcode)
2.修改返回地址,让其指向内存中已有的某个函数(return2libc)
return-to-libc
EIP一旦改写成system函数地址后,那执行system函数时,它需要获取参数。而根据Linux X86 32位函数调用约定,参数是压到栈上的。噢,栈空间完全由我们控制了,所以控制system的函数不是一件难事情。
执行
payload="A"*pad+"BBBB"+p32(sys_addr)+"dead"+p32(sh_addr )
32位数据从右到左存入栈中,先跳转到system函数执行call system
call会把下一条指令入栈即把“system的返回地址入栈,故返回地址随意写
然后执行(/bin/sh)
3.修改返回地址,让其指向内存中已有的一段指令(ROP)
64位传参先存入寄存器
pop edi即把栈顶的数据传入edi寄存器
就是把/bin/sh传入edi
再ret返回system函数取出(/bin/sh)中的数据;
4.修改某个被调用函数的地址,让其指向另一个函数(hijack GOT)