2021-09-09 · 2

バッファオーバーフロー(BOF)

securitypwnable

この記事は公開から2年以上経過しています。

BUFFER OVERFLOW


BOF

設定されているバッファのサイズより大きく入力を受け取れるときに生じる脆弱性です。

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 の協力で作成されました。

コメント

コメントを削除しますか?

関連記事

バッファオーバーフロー(BOF) · 나봄하랑