昨天介绍了rop,今天继续学习rop。
通用rop。
我们知道,在64位系统中,函数的前六个参数是通过寄存器来传递的。但大多数时候,我们很难找到每一个寄存器对应的gadget。这个时候,我们可以利用64位系统下的-libc-csu-init中的gadgets。
这个函数是用来对libc进行初始化操作的,而一般的程序都会调用libc函数,所以这个函数一定会存在。
那这个函数到底干了什么呢?
'我们打开看:从'40061A'开始看,直到'400622',一共pop了6个寄存器,然后ret,也就是说这样就可以实现一下控制6个寄存器的值。不过比较可惜的是,我们想控制的并不是这几个寄存器,我们的目的在于控制rsi和rdi。
r我们看'400600'处的指令:先把r13的值赋给rdx,然后把r14的值赋给rsi,然后把r15d的值赋给edi,最后call了一个r12+rbx*18的地址。
这样,我们在调用这段代码之前,把上述提及的几个寄存器:r13、r14、r15、r12以及rbx的值进行控制了,那就可以达到调用函数的目的了。
而后面那一堆pop的代码,正好可以方便我们控制他们的值。
所以,rop链构造就是:pop6ret+6个寄存器的值+movcall。
最后在顺便学习一下ret2syscall,他实际上和正常的函数调用没啥区别,需要的就是找一下函数调用号表,想用哪个函数,就把rax的值设置为这个数,然后syscall即可。
今天到这。