文章预览
一、前言 本篇文章意旨通过原理+例题的形式带领读者一步步理解栈迁移的原理以及在ctf中的应用。 二、前置知识 在笔者看来栈迁移的原理其实可以总结为一句话:因为栈溢出字节过少所以劫持 rsp 寄存器指向攻击者提前布置好 payload 的内存地址,已达到扩充溢出字节数的目的。
以一个简单的 demo1 为例,程序源码以及编译指令如下所示: #include char buf1[0x100]; void main () { char buf2[0x40]; puts( "First: " ); read (0, buf1, 0x100); puts( "Second: " ); read (0, buf2, 0x60); } // gcc -fno-stack-protector -no-pie -z lazy -o demo1 demo1.c 程序的流程非常简单存在两个输出,第一次是往全局变量 buf1 第二次是往局部变量 buf2 中写入。可以看到在第二次写入时存在明显的栈溢出漏洞,但是溢出的字节数只够写入 0x18 大小的字节,如果要构造gadget泄露内存地址,最短的ROP链
………………………………