fmtstr::[HDCTF 2023]Minions
1 | int __fastcall main(int argc, const char **argv, const char **envp) |
1 | int system_w() |
看到整个题目,思路还是非常清晰的:
- 首先利用 vuln 的格式化字符串漏洞先修改.bss 段上的 key 值进行绕过
- 由于 if 中第一个 read 函数溢出长度不足,我们可以使用栈迁移迁回 vuln 函数复用格式化字符串漏洞
- 再次利用格式化字符串漏洞将 printf.plt 修改为 system.plt
- 再次进入 if,在第一个 read 的时候读取/bin/sh 触发 system(‘/bin/sh’)
1 | .bss:00000000006010A0 public key |
EXP:
1 | from pwn import * |
这里提醒几点,
- 一般来说都是修改 got 为 plt 表进行篡改
- 这里对 send 和 sendline 要求比较严格:我们一般对 puts 的内容+\n,对 read 的内容 send 即可
- https://www.yuque.com/idcm/wnemg9/gwr8a8a3m8h3xomr
更新: 2026-04-06 17:35:38
原文: https://www.yuque.com/idcm/wnemg9/vss41tp1g9d15q7g