問題

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);
bufという名前の文字配列(バッファ)が10バイトのサイズで確保されています。read関数が、標準入力から最大で0x10(16進数で16)バイトのデータをbufに読み込もうとします。- これにより、
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文字入れるとフラグは現れません。



コメント