1 |
|
其作用是用户上下文的设置,所以我们在可以小范围控制执行流已知libc_base但不足以完成我们的目标时可以先跳setcontext+53来扩大控制范围。非常好用的一个函数,可以直接控制大部分寄存器和执行流
1 | <setcontext>: push rdi |
至于为什么要从setcontext+53
开始,因为fldenv [rcx]
指令会造成程序crash,所以要避开这个指令,正如汇编一样,跳到setcontext+53
可以直接地控制rsp,rbx等多个寄存,都由rdi的内容决定
注意:要构造好rsp的值,因为有push rcx 指令,如果 rsp指向的内存不可访问同样会crash.
构造ucontext_t
可以直接用pwntools的SigreturnFrame()
1 | # 指定机器的运行模式 |
注意:[rdi+0xa8](被弹到rcx的那个地址)对应的是 frame 框架的 rip 。
利用思路:一般用来执行mprotect
函数,后注放shellcode。也可以直接执行ROP链。
参考:http://blog.eonew.cn/archives/993
https://n132.github.io/2019/05/10/2019-05-08-Startctf2019-Heap-master/#setcontext