题目信息
- 来源:本地练习(模拟 BUUCTF 风格的 babyrop 题)
- 考点:栈溢出、ret2libc(绕过 NX)
- 难度:入门
漏洞点
read(0, buf, 0x100) 读到 0x28 大小的栈缓冲区,无 canary、无 PIE,但有 NX:无法直接执行 shellcode,所以要 ret2libc。
利用思路
- 第一次溢出:ROP 调用
puts@plt(puts@got)泄漏 libc 地址,再返回main; - 用泄漏值减去 libc 中
puts的偏移,得到 libc 基址; - 第二次溢出:
system("/bin/sh")(/bin/sh用libc.search找),one_gadget 作为备选。
关键代码
1 | from pwn import * |
一句话总结
看到栈溢出先 checksec:没开 PIE 就大胆泄漏 GOT;开了 NX 的第一反应就是 ret2libc,而不是 shellcode。
