当遇到堆题禁用execve时我们就需要用ORW的方法来读取flag,那么堆题如何实现栈迁移来进行ORW就成了一个问题,而利用setcontext是解决这个问题的一个方案
首先来了解什么是setcontext?
setcontext是libc中的一个函数,而它的汇编代码中含有大量的 mov <寄存器> 这类汇编语句,如下图(注:setcontext以glibc2.29为分界线,2.29以下和2.29及以上有较大不同):
![![[Pasted image 20250227233231.png]]](https://i-blog.csdnimg.cn/direct/b131f540aa624593a961ecd343a01825.png)
上图是glibc2.27中的 setcontext 的汇编部分,可以看到其中有非常多的控制寄存器的mov指令,它们都利用 rdi+<偏移值> 来获取具体的数值,所以如果我们可以控制 rdi寄存器 随后将程序跳转到 setcontext+53(也就是图中mov rsp,[rdi+0xa0h]的位置) 这样我们就可以控制包括 rip rsp 这两个重要寄存器,
基本思路
控制执行流之后就有两种思路:
- 是直接控制程序执行流去执行
ROP链 - 是先用
mprotect函数开辟一段可读可写可执行的空间再跳到上面去执行shellcode
这里我们主要讲解执行ROP链打ORW的思路:
控制 rsp寄存器 到我们布置好 ROP的地址,然后控制 rip 为 ret地址
如何控制rip并开始ORW?
通过观察上图发现最后一条指令是ret而其中有一个push rcx的操作,因此可以判断ret返回的地方就是rcx中存储的地址
那么此时栈中的情况就是下面的这样
ORW部分的代码
... ...
ORW部分的代码
rcx中的值 <-- rsp
-----我是分割线----

最低0.47元/天 解锁文章
933

被折叠的 条评论
为什么被折叠?



