web-dev-qa-db-ja.com

ROPチェーンの構築に関する問題

小さなプログラムを悪用しようとしています。プログラムは次のようになります。

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)

何が欠けていますか?

乾杯

8
alive-and-well

PIE/ASLRが欠落している可能性があります。これにより、ローダーは実行されるたびに実行可能ファイルを別のアドレスに配置します。つまり、ガジェットは毎回別のアドレスに配置されます。それを無効にする方法がある場合は、コンパイラを調べてください。多くのgccビルドでは、たとえば-no-pieを使用します。そうでない場合は、環境全体でASLRを無効にできる場合があります。これはLinuxの種類によって異なりますが、最も一般的な方法(私は信じています)は

Sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'
1
Tobias

さらなる分析なしでは、これの正確な原因を特定することは困難です。よくある問題の1つは、アプリケーションをデバッガーの下で実行するとメモリレイアウトがわずかに変更され、デバッガーが接続されている場合と接続されていない場合のエクスプロイトを破壊するのに十分な場合があります。デバッガーを接続せずに実行してから、コアダンプを分析しましたか?

しかしながら pop edx;retは、別のアドレスまたはpop edx; pop eax; ret。 ROPチェーンを組み立てることはパズルであり、それを行う方法は複数あります。

1
wireghoul