啥也不会还想学PWN

本文讲述了如何在64位系统中利用libcsu-init的初始化函数来构造ROP链,重点在于控制rsi和rdi寄存器,涉及pop6ret、寄存器值操作和call指令的使用,以及ret2syscall的基本原理。
摘要由CSDN通过智能技术生成

昨天介绍了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即可。

今天到这。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值