2021-09-09 · 2분
缓冲区溢出(BOF)
缓冲区溢出漏洞入门:它是什么、HackCTF #1 的 fgets(s, 45, ...) 往大小为 40 的缓冲区输入如何越过 s[40] 控制 v5,以及无界的 scanf("%s") 如何让你覆盖 SFP 和返回地址。
2021-09-09 · 2분
这篇文章发布已超过两年,内容可能已过时。
FSB(Format String Bug)
FSB(Format String Bug)是缓冲区溢出黑客技法之一,是一种能通过用户输入改变程序流程的漏洞。

printf("%d", 变量); 与 printf("%d")
在右边的情况下会发生 FSB 漏洞,能把 main 函数栈的内容全部暴露出来。

AAAA 进入第 2 个位置的样子
如上输入就能泄露下一个栈的内存。上面可以确认我们输入的 AAAA 进入了第二个 %p。此时 offset 是 2。
<table style="border-collapse: collapse; width: 100%; height: 180px;" border="1" data-ke-align="alignLeft"><tbody><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">%s</td><td style="width: 50%; text-align: left; height: 20px;">输出字符串直到遇到 '\0'</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%c</td><td style="width: 50%; height: 20px;">1 个字符</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%d</td><td style="width: 50%; height: 20px;">+/- 有符号整型</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%x</td><td style="width: 50%; height: 20px;">把整数以小写十六进制</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%p</td><td style="width: 50%; height: 20px;">输出 0x~ 形式的指针值,与 %lx 相同</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%lx</td><td style="width: 50%; height: 20px;">输出 8byte 十六进制</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%ld</td><td style="width: 50%; height: 20px;">long 整型</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%f</td><td style="width: 50%; height: 20px;">浮点型</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%u</td><td style="width: 50%; height: 20px;">无符号整数 </td></tr></tbody></table>
实际的 fsb 代码会变得非常复杂,但用 Python 的 pwntools 可以轻松解决。
使用 fmtstr_payload(offset, writes),就能非常简单地做 fsb。
fmtstr_payload(6, {e.got['printf']:e.symbols['win']})
如上书写,当 offset 为 6 时,可以让 printf 变成 win 函数。
参考
查看更多
原文(韩语): tistory — 发布于 2021-09-09,已迁移至本博客。本翻译由 AI 协助完成。
…