[AlpacaHack]simpleoverflow – WriteUp

問題

simpleoverflow - AlpacaHack
Cでは、0がFalse、それ以外がTrueとして扱われます。

ソースコード

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
  char buf[10] = {0};
  int is_admin = 0;
  printf("name:");
  read(0, buf, 0x10);
  printf("Hello, %s\n", buf);
  if (!is_admin) {
    puts("You are not admin. bye");
  } else {
    system("/bin/cat ./flag.txt");
  }
  return 0;
}

__attribute__((constructor)) void init() {
  setvbuf(stdin, NULL, _IONBF, 0);
  setvbuf(stdout, NULL, _IONBF, 0);
  alarm(120);
}

脆弱性の詳細

main関数内の以下の部分に問題があります。

char buf[10] = {0};
int is_admin = 0;
printf("name:");
read(0, buf, 0x10);
  1. bufという名前の文字配列(バッファ)が10バイトのサイズで確保されています。
  2. read関数が、標準入力から最大で0x10(16進数で16)バイトのデータをbufに読み込もうとします。
  3. これにより、bufのサイズ(10バイト)を超えるデータが書き込まれる可能性があり、バッファオーバーフローが発生します。

攻撃の可能性

この脆弱性を利用すると、bufのメモリ領域を超えてデータが書き込まれ、スタック上の他の変数(この場合はis_admin変数)が上書きされる可能性があります。

if (!is_admin) {
    puts("You are not admin. bye");
  } else {
    system("/bin/cat ./flag.txt");
  }

is_admin変数の値が0以外の値に書き換えられた場合、if (!is_admin)の条件が偽となり、以下のコードが実行されてしまいます。

system("/bin/cat ./flag.txt");

これにより、攻撃者はflag.txtファイルの内容を閲覧できてしまいます。

対策

read関数で読み込むサイズを、バッファのサイズ(この場合は10バイト未満)に制限することで、この脆弱性を修正できます。

例:

read(0, buf, sizeof(buf) - 1);

これにより、バッファオーバーフローを防ぎ、安全性を高めることができます。

WriteUp

ncコマンドでサーバに接続して、nameを聞かれるのでキーボードから文字列を入力します

buf[10]を超える文字列を入力すればいいので適当に10文字以上の文字列を入れてみます

するとフラグが現れます

9文字入れるとフラグは現れません。

コメント

タイトルとURLをコピーしました