setcontext 说明
复制本地路径 | 在线编辑
主要参考文章:https://blog.wingszeng.top/pwn-glibc-setcontext/
setcontext 是 glibc 中的一个函数,里面有某些片段可以被我们所用,如下图所示(不同版本不一样,这里是 glibc 2.27):

可以看到, 从 0x52085 开始, 一直在通过 rdi 指向的地址处去设置寄存器的值, 除了 rax 最后赋值为 0。 最后会执行 ret,而返回地址追根溯源是在 0x520ae 处的 push rcx,这条语句最终是返回地址。
而我们知道, 函数调用时, 第一个参数就是放在 rdi 里的,所以我们可以利用上面那一段代码进行操作。
举例而言,如果 free hook 被覆盖成了 (setcontext + 0x35) 这个位置, 然后执行 free(addr)。而 addr 即 rdi, 是某个 chunk 的地址,里面的数据我们可以控制。所以只要调用这个,我们精心设置好 chunk 中的数据,就可以设置各个寄存器, 达到随意控制程序执行流的目的.
后续一般就可以让 rsp 跳到事先布置好的 ROP 链上, 或者 rip 跳到 mprotect 函数去开一段可执行空间, 然后执行事先写好的 shellcode.