如何"干净"缓冲区溢出攻击后终止程序

时间:2014-09-29 05:16:46

标签: c buffer-overflow

我正在研究缓冲区溢出,我正试图跳转到'confused'函数,然后通过执行缓冲区溢出在main的末尾打印出“done”。

#include<stdio.h>
#include<stdlib.h>

int i, n;
void confused(int i) {
  printf("**Who called me? Why am I here?? *** %x\n ", i);
  ;
}

void shell_call(char *c) {
  printf(" ***Now calling \"%s\" shell command *** \n", c);
  system(c);
}

void victim_func(){
  int a[4];
  printf("\nEnter n:  ");  scanf("%d",&n);
  printf("~~~~~~~~~~~~~ values and address of n locations ~~~~~~~~~~");
  for (i = 0;i <n ;i++)
    printf ("\n a[%d] = %x, address = %x", i, a[i], &a[i]);
  printf("\nEnter %d HEX Values \n", n);

  // Buffer Overflow vulnerability HERE!

  for (i=0;i<n;i++)  scanf("%x",&a[i]);
    printf("Done reading junk numbers\n")
}

int main() {
  printf("\n ~~~~~~~~~~~~~~~~~ Info Menu ~~~~~~~~~~~~");
  printf("\n addrss of main %x", main);
  printf("\n addrss of shell_cal %x", shell_call);
  printf("\n addrss of confused %x", confused);
  victim_func();
  printf("\n done");
  return 0;
}

我做的是将7放入n,对于第6个十六进制值,我插入了困惑的地址,并在main中输入了printf的地址的第7个。它在混淆函数之后成功打印出“完成”,但程序回到main的开头。我认为该程序将在打印完“完成”后终止。

我只是想知道我做错了什么,或者它应该是这样做的。

1 个答案:

答案 0 :(得分:0)

您始终可以在shell代码中调用exit()来终止程序。但是,您不能使用system()来执行此操作,因为system()将创建一个始终最终返回其父级的子进程。您需要使用程序集直接调用exit()。