2016-10-13 6 views
1

ネット上で興味深い練習問題が見つかりました。特定の入力がバッファにオーバーフローされ、「秘密」がstdoutに出力されることが示されています。スタックバッファオーバーフロー(C)を使用して情報を取得する

私は自分自身でそれを理解しようとしましたが、うまく行っていません。ここで

は、コードは次のとおりです。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
void get_name(char *name, char *pr) { 
    char local[20]; 
    printf("%s:",pr); 
    gets(local);// BUG 
    strncat(name,local,20); 
} 
int foo() { 
    char name[28]="Hello.."; 
    char secret[12]="TOP SECRET"; 
    char buf[24]; 
    char n1[]="Enter your name"; 
    char n2[]="Enter Secret code"; 
    get_name(name,n1); 
    memset(buf, 0, sizeof(buf)); 
    // Lets ONLY use strncpy for better control!!! 
    strncpy(buf, name, sizeof(buf));//BUG 
    printf("%s\n", buf); 
    memset(name,0,sizeof(name)); 
    get_name(name, n2); 
    if (strncmp(secret,name,10)==0) 
     printf("Welcome and %s\n",buf); 
    else {printf("Wrong code, better try again..\n");} 
    return 0; 
} 


int main(int argc, char **argv) 
{ 
    foo(); 
    printf("Bye\n"); 
    return 0; 
} 
+1

私はコンパイル行が見つからないと思っていますが、通常、次のようなコメントを書きます: 'gcc -o -m32 buffer_overflow buffer_overflow.c -fno-stack-protector'この問題を解決するには、(特に '-m32'と' -fno-stack-protector')が必要です。 – plean

答えて

1

なバッファオーバーフローの結果がどうなるかを知る方法はありません。どのメモリが上書きされるかはわかりません。ほとんどの場合、実行時クラッシュの原因になります。どんな悪用も非常に具体的なシステムを念頭に置かなければなりません。つまり、特定のシステムの詳細を知らなくても、誰もあなたの質問に答えることができないということです。

あなたの "ランダムインターネット人"が目指しているのは、Hello..のヌル終了をいくらかのゴミで上書きして、"TOP SECRET"文字列が一緒に印刷されるようにすることです。ただし、これらの2つの文字列が隣接して割り当てられていると考えることはできません。 getsに28文字の長い入力を入力しようとすると、何が起こるのかを見ることができます...与えられた動作の保証はありません。私のコンピュータでは、ゴミを印刷する以外に何もエキサイティングなことはありません。私のバイナリのリバースエンジニアリングは、配列が本当に隣接して割り当てられていないためです。

さらに、strncpyについてのご意見は間違っています。strncpyは危険ですので避ける必要があります。see this

+1

このコメントは私のものではなく、運動と一緒に提供されました –

+1

@ ro.Loon練習を書いた人は、Cに関する深い知識が不足しているようです。 – Lundin

+2

あなたは何が尋ねられているのかとは異なる質問に答えているようです。例えば、このコードでは 'strncpy'の使用は100%意図的で、1ビットは誤っているとは思われません(コードと演習の目的上)。 – hyde

関連する問題