私は C でセキュリティの問題を経験していました。以下のコードがどのようにスタックを破壊するのか理解できませんでした。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int chk_perm(){
printf("\n Check Perm \n");
return 2;
}
int main(int argc,char* argv[]){
int fg;
char filename[16];
if(argc != 2){
fprintf(stderr,"Usage : %s filename\n",argv[0]);
exit(1);
}
fg = chk_perm();
strcpy(filename,argv[1]);
if(fg == 0xdeadbeef){
//execute as root or deposit million dollars in bank account
}
else{
//execute as a normal user , deduct $10 from an account
}
return 0;
}
渡された argv[1] は、fg の値を変更する場合があります。渡された argv[1] が望ましくない結果を引き起こす可能性のあるバイナリ全体であり、戻りアドレスとともに引数として渡すことができる場合、破損が発生すると言われています。
fg の値が変更されるように、strcpy がスタック check_perm をどのように破損するかを理解できませんでした。
プログラムについての私の仮定は、
プログラムの実行が開始されると、メイン関数のスタックが作成され、その引数、戻りアドレス、ローカル変数がスタックに置かれます。したがって、int fg はスタックの 4 バイト (08567500 loc) を占有し、filename[16] は次の 16 を占有します。バイト (08567504)。ファイル名が 16 バイトを超えてオーバーフローしている場合でも、その後にローカル変数が存在すると破損する可能性があります。
では、strcpy(filename,argv[1]); が原因で fg がどのように破損するのでしょうか。