2021-09-09 · 2

FSB(Format String Bug)

securitypwnable

这篇文章发布已超过两年,内容可能已过时。

FSB(Format String Bug)


FSB(Format String Bug)是缓冲区溢出黑客技法之一,是一种能通过用户输入改变程序流程的漏洞。

FSB(Format String Bug)

  1. printf 的参数个数由格式字符的个数决定。
  2. 如果 buf 的值能由我们随意输入,就能放入想要的格式字符进行操纵。
  3. 即使不发生 BOF 也能获得想要的值。

printf("%d", 变量); 与 printf("%d")

在右边的情况下会发生 FSB 漏洞,能把 main 函数栈的内容全部暴露出来。

%p 输出

  1. 通过 %p 可以泄露下一个地址,通过 %[数字]$p 可以输出相隔该数字位的内存。

AAAA 进入第 2 个位置的样子

如上输入就能泄露下一个栈的内存。上面可以确认我们输入的 AAAA 进入了第二个 %p。此时 offset 是 2。

%n 输入

  1. 这次不只是泄露,而是篡改栈的值。
  2. %n 会把 %n 之前所输出字符的个数,以十进制形式写入指定的变量。
  3. %n : 4byte,%hn : 2byte,%hhn : 1byte

printf 的格式字符

<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>

在 python 中

实际的 fsb 代码会变得非常复杂,但用 Python 的 pwntools 可以轻松解决。

使用 fmtstr_payload(offset, writes),就能非常简单地做 fsb。

fmtstr_payload(6, {e.got['printf']:e.symbols['win']})

如上书写,当 offset 为 6 时,可以让 printf 变成 win 函数。

参考

查看更多

https://snwo.tistory.com/147

https://jiravvit.tistory.com/entry/64bit%EC%97%90%EC%84%9C-FSB-Format-String-Bug-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-1


原文(韩语): tistory — 发布于 2021-09-09,已迁移至本博客。本翻译由 AI 协助完成。

评论

删除这条评论?

相关文章

FSB(Format String Bug) · 나봄하랑