2012-05-10 3 views
2

私はCコードファイルを与えられています。ここで正しい入力にバッファオーバーフローが発生し、ルートアクセスが許可されています。これはZShellを使ったFedoraバグです。これ(セキュリティの主題)をテストするために、私たちはLinuxカーネルで有効になっているランダムなメモリアドレス割り当てを無効にしました。バッファオーバーフローのテスト

入力がバッファサイズのセグメンテーションフォルトが発生するまで、さまざまな入力をテストするように求められます。私が得られないことは、なぜ異なる値でテストすべきなのでしょうか?私はコードが役立つだろうか分からないが、私は入力を変更する点を得ることはできません。

/* vulnerable.c */ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
unsigned char buf[] = 
"\x31\xc0" /* xorl %eax,%eax */ 
"\x50" /* pushl %eax */ 
"\x68""//sh" /* pushl $0x68732f2f */ 
"\x68""/bin" /* pushl $0x6e69622f */ 
"\x89\xe3" /* movl %esp,%ebx */ 
"\x50" /* pushl %eax */ 
"\x53" /* pushl %ebx */ 
"\x89\xe1" /* movl %esp,%ecx */ 
"\x99" /* cdql */ 
"\xb0\x0b" /* movb $0x0b,%al */ 
"\xcd\x80" /* int $0x80 */ 
; 
/* -------------------------------------------------- */ 
void vuln(char * buf) 
{ 
    char a[16] = { 0 }; 
    strcpy(a, buf); 
} 
int main(int argc, char * argv[]) 
{ 
    int *ret; 
    if (argc != 2) 
    { 
     printf("Usage: %s <input>\n", argv[0]); 
     exit(1); 
    } 
    vuln(argv[1]); 
    printf("%p\n", buf); 
    return 0; 
} 
+0

私はvalgrindで入力をオーバーフローさせ、スタックの値などを調べることをお勧めします。しかし、あなたはアセンブリを書いてバイトコードを手に入れましたか?これを行うのがより理にかなっているかもしれません。また、実行可能スタックがあることを確認してください。入力を変化させるポイントは、スタックで何が起きているのかを判断する可能性が最も高いです。 – RageD

+0

セグメンテーション違反が発生したとき*を理解していますか?あなたは入力を変えずにそれを引き起こす方法を知っていますか、または異なる入力を必要としていますか?実験。 –

+2

あなたは、おそらく割り当てと一緒に行くいくつかのメモがあります。彼らはおそらく、ある時点でスタックレイアウトについて議論していて、それらを再読み込みします。 'vuln'関数が呼び出されると、(とりわけ)配列' a'とリターンアドレスのためにスタックにいくらかのスペースがあります。あなたがフィットするよりも多くのデータを 'a'に書き込もうとするとどうなりますか?簡単に認識できるデータを入力します。 segfaultを取得し、コアダンプを保存します。 GDBでコアダンプを開きます。今度はレジスタを見てください。入力の長さを変えてEIPに表示する特定の値を得ることができるかどうかを確認してください。 –

答えて

1

私は取得しない何を、なぜ私は別の値をテストする必要がありますか?私はコードが役立つだろうか分からないが、私は入力を変更する点を得ることはできません。

バッファオーバーフローは特定の入力がある場合にのみ発生するため、問題の原因となる原因を確認するには別の入力を試す必要があります。

ヒント:バッファのオーバーフローは、ユーザーの入力がプログラムよりも長い場合に発生するため、プログラムがクラッシュしたり予期しないことが発生するまで、さまざまな入力を試してください。

関連する問題