我正在处理 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] 是一个完整的二进制文件,可能会导致不希望的结果可以作为参数与返回地址一起传递,那么就会发生损坏。
我不明白,strcpy 如何破坏堆栈 check_perm 从而改变 fg 的值。
我对程序的假设,
当程序开始执行时,它为 main 函数创建一个堆栈,并将其参数、返回地址、局部变量放入堆栈。因此 int fg 将占用堆栈的 4 个字节(08567500 loc),而 filename[16] 将占用接下来的 16 个字节字节(08567504)。即使文件名溢出超过 16 个字节,如果它之后存在任何局部变量,它也可能会损坏。
那么 fg 是如何由于 strcpy(filename,argv[1]); 而损坏的?