read() syscall を使用してユーザー入力をプログラムにスクリプト化する方法は?

AK-33

Linux 環境でいくつかのバイナリを使用しており、ユーザー入力をスクリプト化しようとしています。たとえば、最初のプログラム prog1.c の場合:

void get_input() {

    int i;
    char buffer[32];

    i = 0;

    while (i < 3) {
        memset(buffer, 0, 32);
        printf("Enter input: ");
        fgets(buffer, 31, stdin);
        printf("Your input: %s\n", buffer);
        i++;
    }
}

prog1 を実行してコンソールから直接入力するか、入力をスクリプト化してプログラムにパイプすることができます。

コンソールから直接入力する:

# ./prog1
Enter input: Stuff1
Your input: Stuff1

Enter input: Stuff2
Your input: Stuff2

Enter input: Stuff3
Your input: Stuff3

#

スクリプト入力:

# perl -e 'print "Stuff1\n" . "Stuff2\n" . "Stuff3\n"' | ./prog1
Enter input: Your input: Stuff1

Enter input: Your input: Stuff2

Enter input: Your input: Stuff3

#

出力のフォーマットが少し乱れていますが、プログラムは期待どおりの出力を表示します。

私の問題は、2 番目のバイナリ prog2.c にあります。

void get_input() {

    int i;
    char buffer[32];

    i = 0;
    while (i < 3) {
        memset(buffer, 0, 32);
        printf("Enter input: ");
        read(0, buffer, 31);
        printf("Your input: %s\n", buffer);
        i++;
    }
}

コンソールから直接入力できる場合:

# ./prog2
Stuff1
Enter input: Your input: Stuff1

Stuff2
Enter input: Your input: Stuff2

Stuff3
Enter input: Your input: Stuff3

#

入力を入力するまでプロンプトが表示されないだけでなく、入力をスクリプト化することさえできません。

# perl -e 'print "Stuff1\n" . "Stuff2\n" . "Stuff3\n"' | ./prog2
Enter input: Your input: Stuff1
Stuff2
Stuff3

Enter input: Your input:
Enter input: Your input:
#

fgets()read()の違いについて調査を行い、次のことを発見しました。

  1. fgets()は C 関数read()ですが、 はシステム コールです。
  2. fgets()改行文字または EOF が検出されるまで入力を読み取りますが、改行はread()syscallに対して同じ効果を持ちません
  3. read()ない何らかのバッファリングメカニズムを採用fgets()しています。

ポイント 2 と 3 は当面の問題に最も関連していると思いますが、問題を解決する方法を示唆していません。

これらのプログラムに与える必要のあるユーザー入力には、印刷できない 16 進バイトが含まれているため、コンソールからそのような入力を直接入力するだけでは不十分です。また、ソース コードをバイナリに変更することもできないため、fgets()入力を収集するためだけに使用する回避策はありません

私の質問は、prog2 に入力を供給して、prog1 と同じ動作をする方法があるかどうかです。

ありがとうございました。

AK-33

この問題の回避策を見つけました。コンソールからの入力をスクリプト化するという、私が望む方法でバイナリを操作することはまだできませんが、プログラムでそれを行う方法を見つけました。

subprocessモジュールのラッパーとして機能する Python ライブラリ スイートを使用していますが、独自に作成することもできます。

p = subprocess.Popen(prog2, stdout=subprocess.PIPE, stdin=subprocess.PIPE)

これにより、バイナリがプロセスとして開き、Python スクリプト内から send および receive 関数を使用してバイナリと対話できます。

これが、同様の問題に遭遇した他の人に役立つことを願っています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

エラー:OpenSSL SSL_read:SSL_ERROR_SYSCALL、errno 10054

分類Dev

C は read syscall を使用してどのようにバイトを読み取りますか?

分類Dev

このalarm()syscallがread()を中断しないのはなぜですか?

分類Dev

PowerShellスクリプトを管理者として実行するように昇格する場合、ユーザーにプロンプトが表示される前に、read-hostがキーボード入力を受け入れるのはなぜですか?

分類Dev

GoのSyscall.RawSyscall()およびSyscall.Syscall()の詳細は?

分類Dev

Dockercomposeインストールエラー 'curl:(56)OpenSSL SSL_read:SSL_ERROR_SYSCALL、errno 104' in Ubuntu

分類Dev

Dockercomposeインストールエラー 'curl:(56)OpenSSL SSL_read:SSL_ERROR_SYSCALL、errno 104' in Ubuntu 18.04.2 LTS

分類Dev

プログラムを実行し、syscallをインターセプトしてリダイレクトします

分類Dev

Pythonでsyscallを作成する

分類Dev

statx syscallの使用方法は?

分類Dev

read()は不正なアドレスで失敗し、valgrindはSyscall param read(buf)がアドレス指定できないバイトを指していることを示します

分類Dev

PHP Soapの問題:OpenSSL SSL_read:SSL_ERROR_SYSCALL、errno 54またはSSL:ピアによって接続がリセットされました

分類Dev

syscall-GoでLPWSTRを使用する方法

分類Dev

syscall.SyscallとWinAPIに関する問題

分類Dev

syscallがユーザースペースプログラムによって呼び出された場合、実行はどのようにカーネルスペースに転送されますか?

分類Dev

Syscall定数syscall.ENONETはGoでは未定義

分類Dev

Golang:Linuxでのsyscall.Syscallの使い方は?

分類Dev

goパッケージ「syscall」で「Syscall()」は何を意味しますか?

分類Dev

MIPSのリンクリストでsyscall9を使用する

分類Dev

FreeBSDで「read-i」を使用する方法は?(ユーザー入力の事前入力)

分類Dev

アセンブリ(x86 / 64)からread syscallを呼び出すと、セグメンテーション違反が発生します(コンパイラーの構築)

分類Dev

syscall対Cシステムコール

分類Dev

syscallエラーのモック

分類Dev

System.in.readは、()の入力を求めるプロンプトを表示せずにスキップします

分類Dev

splice syscallを使用した出力がない

分類Dev

インクリメンタルread()を実行するCプログラムを使用して、ファイルシステムで使用されるブロックサイズを決定するにはどうすればよいですか?

分類Dev

tail、while、read、およびを使用しているシェルスクリプトで、非ローリングログファイルとパターンマッチを検出する方法は?

分類Dev

文字列をSyscall(uintptr)に渡す

分類Dev

独自の syscall を実装する

Related 関連記事

  1. 1

    エラー:OpenSSL SSL_read:SSL_ERROR_SYSCALL、errno 10054

  2. 2

    C は read syscall を使用してどのようにバイトを読み取りますか?

  3. 3

    このalarm()syscallがread()を中断しないのはなぜですか?

  4. 4

    PowerShellスクリプトを管理者として実行するように昇格する場合、ユーザーにプロンプトが表示される前に、read-hostがキーボード入力を受け入れるのはなぜですか?

  5. 5

    GoのSyscall.RawSyscall()およびSyscall.Syscall()の詳細は?

  6. 6

    Dockercomposeインストールエラー 'curl:(56)OpenSSL SSL_read:SSL_ERROR_SYSCALL、errno 104' in Ubuntu

  7. 7

    Dockercomposeインストールエラー 'curl:(56)OpenSSL SSL_read:SSL_ERROR_SYSCALL、errno 104' in Ubuntu 18.04.2 LTS

  8. 8

    プログラムを実行し、syscallをインターセプトしてリダイレクトします

  9. 9

    Pythonでsyscallを作成する

  10. 10

    statx syscallの使用方法は?

  11. 11

    read()は不正なアドレスで失敗し、valgrindはSyscall param read(buf)がアドレス指定できないバイトを指していることを示します

  12. 12

    PHP Soapの問題:OpenSSL SSL_read:SSL_ERROR_SYSCALL、errno 54またはSSL:ピアによって接続がリセットされました

  13. 13

    syscall-GoでLPWSTRを使用する方法

  14. 14

    syscall.SyscallとWinAPIに関する問題

  15. 15

    syscallがユーザースペースプログラムによって呼び出された場合、実行はどのようにカーネルスペースに転送されますか?

  16. 16

    Syscall定数syscall.ENONETはGoでは未定義

  17. 17

    Golang:Linuxでのsyscall.Syscallの使い方は?

  18. 18

    goパッケージ「syscall」で「Syscall()」は何を意味しますか?

  19. 19

    MIPSのリンクリストでsyscall9を使用する

  20. 20

    FreeBSDで「read-i」を使用する方法は?(ユーザー入力の事前入力)

  21. 21

    アセンブリ(x86 / 64)からread syscallを呼び出すと、セグメンテーション違反が発生します(コンパイラーの構築)

  22. 22

    syscall対Cシステムコール

  23. 23

    syscallエラーのモック

  24. 24

    System.in.readは、()の入力を求めるプロンプトを表示せずにスキップします

  25. 25

    splice syscallを使用した出力がない

  26. 26

    インクリメンタルread()を実行するCプログラムを使用して、ファイルシステムで使用されるブロックサイズを決定するにはどうすればよいですか?

  27. 27

    tail、while、read、およびを使用しているシェルスクリプトで、非ローリングログファイルとパターンマッチを検出する方法は?

  28. 28

    文字列をSyscall(uintptr)に渡す

  29. 29

    独自の syscall を実装する

ホットタグ

アーカイブ