私はアセンブリで書いていますが、execveのシステムコールを実行する方法を理解しようとしていますが、出力を端末に出力する代わりに、格納されている場所を知りたいので、パイピングコマンドのようなもの。アセンブリで実行した後、execveのシステムコールをレジスタまたはスタックに戻すにはどうすればいいですか?
例えば、ここでのアセンブリは、本質的に「LS $」コマンドを実行してはexecveを経由して「」、コマンドを実行するためです:
GLOBAL _start
SECTION .TEXT
_start:
XOR EAX,EAX
PUSH EAX
PUSH 0x68636968
PUSH 0x772f6e69
PUSH 0x622f7273
PUSH 0x752f2f2f
MOV EBX, ESP
PUSH EAX
PUSH 0x736c
MOV ESI, ESP
XOR EDX, EDX
PUSH EDX
PUSH ESI
PUSH EBX
MOV ECX, ESP
MOV AL, 0x0B; EXECVE SYSCALL NUMBER
INT 0x80
行7-10は、スタック上に/usr/bin/which
のアドレスをプッシュして、 13行目が引数ls
をスタックにプッシュします。次に、引数配列をスタックにプッシュし、ECXに保存します。EBXは、場所のアドレスを指しています。/usr/bin/which
、EAXは、execveのシステムコール用のシステムコール番号0xb(11)に設定されています。実行すると、/bin/ls
が返され、見つかった場所はls
となります。
/bin/ls
の結果を他の用途のために保存するにはどうすればよいですか?コードを書き続け、次のコードの一部としてここに返されたものを使用したい場合は、返された値をレジスタまたはスタックに保持するにはどうすればよいですか?
[出力をバッファまたはファイルにリダイレクトする](https://stackoverflow.com/questions/2605130/redirecting-exec-output-to-a-buffer-or-file)の重複が考えられます。 –
execveが失敗しない限り返されません。 – stark