1

ネットで興味深い演習を 1 つ見つけました。「シークレット」が標準出力に出力されるような方法で、特定の入力がバッファをオーバーフローする可能性があると記載されています。

自分なりに考えてみましたが、うまくいきませんでした。

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

#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;
}
4

1 に答える 1

1

このようなバッファ オーバーフローの結果がどうなるかを知る方法はありません。どのメモリが上書きされるかを知ることも、想定することもできません。ほとんどの場合、何らかの実行時クラッシュを引き起こすだけです。エクスプロイトは、非常に特殊なシステムを念頭に置く必要があります。つまり、特定のシステムの詳細を知らなければ、誰もあなたの質問に答えることができないということです。

あなたの「ランダムなインターネット担当者」が目指しているのは、null 終端をHello..ゴミで上書きする可能性が高いため、"TOP SECRET"文字列が一緒に印刷されます。ただし、これら 2 つの文字列が隣接して割り当てられているとは限りません。に 28 文字の長さの入力を入力してgets、何が起こるかを確認してみてください。特定の動作が保証されるわけではありません。私のコンピューターでは、ゴミを印刷する以外に何もエキサイティングなことはありません。私のバイナリをリバースエンジニアリングすると、配列が実際に隣接して割り当てられていないことが原因であることが明らかになりました。

さらに、あなたのコメントstrncpyは見当違いでstrncpyあり、危険であり、避けるべきです。これを参照してください

于 2016-10-13T09:52:29.953 に答える