小さなプログラムを悪用しようとしています。プログラムは次のようになります。
int func(void) {
char text[100];
scanf("%s", text);
return 0;
}
int foo(unsigned short Rand) {
char RandomBuffer[Rand];
return func();
}
int main(int argc, char* args[]) {
srand(time(NULL));
return foo(Rand() % 1000);
}
ROPgadget を使用してROPチェーンを構築しました。ツールは、攻撃に必要なガデを見つけます。
Gadget found: 0x8058fcc pop edx ; ret
私のROPチェーンは次のように始まります:
p = ‘rnd padding’
p += pack('<I', 0x08058fcc) # pop edx ; ret
しかし、私のエクスプロイトを実行すると、次のようになります。
Stopped reason: SIGILL
0x08058fcc in _int_memalign ()
EIPはROPgadgetによって計算されたアドレスを指していますが、どういうわけかそれは正しいコマンドではありません。
EIP: 0x8058fcc (<_int_memalign+108>: lock mov eax,esi)
何が欠けていますか?
乾杯
PIE/ASLRが欠落している可能性があります。これにより、ローダーは実行されるたびに実行可能ファイルを別のアドレスに配置します。つまり、ガジェットは毎回別のアドレスに配置されます。それを無効にする方法がある場合は、コンパイラを調べてください。多くのgccビルドでは、たとえば-no-pieを使用します。そうでない場合は、環境全体でASLRを無効にできる場合があります。これはLinuxの種類によって異なりますが、最も一般的な方法(私は信じています)は
Sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'
さらなる分析なしでは、これの正確な原因を特定することは困難です。よくある問題の1つは、アプリケーションをデバッガーの下で実行するとメモリレイアウトがわずかに変更され、デバッガーが接続されている場合と接続されていない場合のエクスプロイトを破壊するのに十分な場合があります。デバッガーを接続せずに実行してから、コアダンプを分析しましたか?
しかしながら pop edx;ret
は、別のアドレスまたはpop edx; pop eax; ret
。 ROPチェーンを組み立てることはパズルであり、それを行う方法は複数あります。