1

私はコンピューターの脆弱性を研究しており、この問題に数え切れないほど取り組んできました。ヒープが正しくオーバーフローしないようです。glibcがメモリの破損を検出したにもかかわらず、MALLOC_CHECK_を無効にすると、チャンクヘッダーを上書きしても問題がないかのように、プログラムが正しく実行されて終了します。Kubuntu12.04を実行しています。

この演習は「TheShellcoder'sHandbook、2nd Edition」からのものであり、オンラインのヒープオーバーフローチュートリアルでも取り上げられています。Tの指示に何度も従って、同じ結果を受け取りました。

これが私のプログラムのコードです:

/*basicheap*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main(int argc, char ** argv){

    char *buf;
    char *buf2;

buf=(char*)malloc(1024);
buf2=(char*)malloc(1024);
printf("buf=%p buf2=%p\n", buf, buf2);
strcpy(buf,argv[1]);
free(buf2);
free(buf);
}

glibcを使用してバッファを超えて書き込む場合:

xxx@xxx-xxx:~/CProgs$ ./basicheap $(perl -e 'print "A"x1028')
buf=0x9356718 buf2=0x9356b20
*** glibc detected *** ./basicheap: double free or corruption (!prev): 0x09356b20 ***
======= Backtrace: =========
[0x804abff]
[0x8048f4a]
[0x80490d6]
[0x8048e29]
======= Memory map: ========
08048000-080ec000 r-xp 00000000 08:07 6816172    /home/xxx/CProgs/basicheap
080ec000-080ee000 rw-p 000a3000 08:07 6816172    /home/xxx/CProgs/basicheap
080ee000-080f0000 rw-p 00000000 00:00 0 
09355000-09377000 rw-p 00000000 00:00 0          [heap]
b772a000-b772c000 rw-p 00000000 00:00 0 
b772c000-b772d000 r-xp 00000000 00:00 0          [vdso]
bfc14000-bfc36000 rw-p 00000000 00:00 0          [stack]
Aborted (core dumped)
xxx@xxx-xxx:~/CProgs$ 

glibcをオフにしてバッファを超えて書き込む場合:

xxx@xxx-xxx:~/CProgs$ MALLOC_CHECK_=0 ./basicheap $(perl -e 'print "A"x1028')
buf=0xa077718 buf2=0xa077b20
xxx@xxx-xxx:~/CProgs$

上書きなしのチャンクヘッダーのGDB:

(gdb) run $(perl -e 'print "A"x1024')
Starting program: /home/xxx/CProgs/basicheap $(perl -e 'print "A"x1024')
buf=0x80f1718 buf2=0x80f1b20

Breakpoint 1, main (argc=2, argv=0xbfffedf4) at basicheap.c:16
16      free(buf2);
(gdb) x/x buf2-4
0x80f1b1c:      0x00000409
(gdb) x/x buf2-8
0x80f1b18:      0x00000000
(gdb) x/x buf2-12
0x80f1b14:      0x41414141
(gdb) 

上書きされたチャンクヘッダーのGDB:

(gdb) run $(perl -e 'print "A"x1032')
Starting program: /home/xxx/CProgs/basicheap $(perl -e 'print "A"x1032')
buf=0x80f1718 buf2=0x80f1b20

Breakpoint 1, main (argc=2, argv=0xbfffede4) at basicheap.c:16
16      free(buf2);
(gdb) x/x buf2-4
0x80f1b1c:      0x41414141
(gdb) x/x buf2-8
0x80f1b18:      0x41414141
(gdb) x/x buf2-12
0x80f1b14:      0x41414141
(gdb) 

どちらの場合も、プログラムは正常に終了します。私は何が欠けていますか?それらは、Ubuntuの最新バージョンでのヒープの動作を変更しましたか?どんな助けでも大歓迎です!

更新:gdbでアセンブリをステップ実行し、プログラムが関数free_check()および関数mem2chunk_check()に入ることがわかりました。

mem2chunk_check()関数では、上書きされた値がESIレジスタで取得され、EDIレジスタはその値のアドレスを指します。ESIの値でそれが行われているのを見る唯一のことは、1を引いてから、値をダンプすることです。

多くのグーグル検索の後、mem2chunk_check()関数に関するドキュメントを見つけることができませんでした。

これらのヒープオーバーフローは、最新のシステムでは廃止されていますか?

4

2 に答える 2

1

過去数年間、ベンダーはデフォルトでメモリ操作機能の「強化」バージョンを使用してきました。たとえば、memsetの代わりに'builtin_memset_chk'を取得し、strcpyの代わりに'strcpy_chk'を取得します。

単純なオーバーフロープログラムを機能させるには、次のコマンドを使用してプログラムをビルドする必要があります。

-fno-stack-protector -D_FORTIFY_SOURCE=0
于 2012-08-09T08:11:49.870 に答える
0

まず第一に、今日、Linuxでのヒープの悪用は非常に難しいということです。異なるバッファがオーバーフローした場合、それらを上書きするのは簡単ですが、難しいのは任意のコードを実行することです。

ヒープエクスプロイトの内部動作を知りたい場合は、この投稿で言及した論文を読む必要があります。ヒープオーバーフローを使用して任意のデータを書き込む

これらの概念を理解したら、malloc malleficarumで使用/説明されているほとんどのメソッドに(サイレントに)パッチが適用されていることを警告します。それらのどれかが今日でも機能するかどうかはわかりません。

一方、本当に知識を向上させたい場合は、Linuxのアロケータに基づいているptmalloc実装( http://www.malloc.de/en/から)をダウンロードすることをお勧めします。それをコンパイルし(「共有する」、「-g」フラグを追加することも役立ちます)、LD_PRELOADを使用してロードします。このようにして、gdbを使用してmallocコードを段階的にデバッグできるようになります。

幸運を!

于 2012-08-27T15:17:48.220 に答える