2021-09-09 · 2분
FSB(Format String Bug)
Format String Bug の入門:printf への引数不足で %p や %[n]$p を使ってスタックを漏洩させる方法、%n でメモリを改ざんする方法、printf フォーマット文字の表、そして exploit に pwntools の fmtstr_payload を使う方法。
2021-09-09 · 2분
この記事は公開から2年以上経過しています。
BUFFER OVERFLOW
設定されているバッファのサイズより大きく入力を受け取れるときに生じる脆弱性です。
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s[40]; // [esp+4h] [ebp-34h] BYREF
int v5; // [esp+2Ch] [ebp-Ch]
v5 = 0x4030201;
fgets(s, 45, stdin);
printf("\n[buf]: %s\n", s);
printf("[check] %p\n", v5);
if ( v5 != 0x4030201 && v5 != 0xDEADBEEF )
puts("\nYou are on the right way!");
if ( v5 == 0xDEADBEEF )
{
puts("Yeah dude! You win!\nOpening your shell...");
system("/bin/dash");
puts("Shell closed! Bye.");
}
return 0;
}
HackCTF 1 番問題のコードを持ってきました。s の配列のサイズは 40 ですが、fgets(s, 45, stdin); で 45 分のバッファを入力受け取ります。ここで BOF が起きるのです。

1 番スタック
現在 s[40] で入力していて、合計 45 分入力できるため、s[40] を全部埋めて v5 まで変えられます。
その v5 が 0xDEADBEEF になれば exploit に成功します。
//gcc -fno-stack-protector -z execstack -no-pie -o bof bof.c
#include <stdio.h>
int main(void) {
char buf[40];
scanf("%s", buf);
printf("%s", buf);
}
ここにもっと簡単なコードがあります。実は私たちが C 言語を初めて学ぶとき、上のように scanf("%s", buf); のようなコードで書くことになります。あのような形式のコードは非常に危険なコードです。%40s のように長さを指定していないため、buf[40] + sfp まで覆って return address アドレスを上書きできてしまいます。
ここで sfp とは Stack Frame Pointer の略で、文字どおり上位スタックフレームのベースポインタを指します。
32bit では 4byte、64bit では 8byte を占めています。もし bof が return address まで覆えるほどの長さなら、buffer + sfp[4 or 8] + return address のように書く必要があります。
ここまでが bof でした。とても簡単な概念なので、説明することもあまりない気がしますね ,;,ㅡ,;,
原文(韓国語): tistory — 2021-09-09 公開、当ブログへ移行。この翻訳は AI の協力で作成されました。
…