修改shellcode的返回地址

时间:2014-10-21 20:01:28

标签: c assembly buffer buffer-overflow exploit

我有两个C程序。一个是shellcode,另一个是易受攻击的程序。

我想更改返回地址而不用缓冲易受攻击的程序。

例如: -

__asm__("movl $shellcode, 4(%ebp)");

但是这个方法对我来说不起作用,我尝试在linux下使用gdb运行易受攻击的程序并将shellcode重定向到它(gdb) run vuln < shellcode但是eip或ebp永远不会改变。 有人可以看看我的shellcode程序,看看错误在哪里。

shellcode程序

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

void shellcode() {
__asm__(".byte 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90"); /* you may put your shellcode here */
printf("hey guyz!\n");
exit(0);
}

void bang(int val) {

__asm__("movl $shellcode, 4(%ebp)");

}

int main() {
bang(0);
}

易受攻击的程序

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

int bof(char *string) {

char buffer[1024];

strcpy(buffer, string);

return 1;
}

int main(int argc, char *argv[]) {

bof(argv[1]);
printf("Done..\n");

return 1;
}

1 个答案:

答案 0 :(得分:0)

您要实现的目标称为Stack buffer overflow

基本上, 你写入堆栈的字节比你应该多,并覆盖返回地址。

当你输入一个函数时,堆栈看起来像这样(简化):

  +----------------+
  | Buffer[0]      |
  | Buffer[1]      |
  | .              |
  | .              |
  | .              |
  | Buffer[1023]   |
  | Return Address |
  +----------------+

因此,您必须写入至少1025个字节才能到达返回地址。 一旦你这样做并且函数返回,它将尝试返回你放在那里的任何值。

以下是一个例子:

说我们有一个名为“exploit.txt”的文件,里面装满了32个A:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

并且易受攻击的程序如下所示:

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

void func(FILE *f)
{
   long size;
   char c[12];  // You should only write 12 bytes here
   fseek(f, 0, SEEK_END);
   size = ftell(f);
   rewind(f);
   fread(c, 1, size, f);    // no bounds checking
}

int main(int argc, char **argv)
{
   FILE *f = NULL;
   if(f = open("exploit.txt", "r"))
   {
      func(f);
      fclose(f);
   }

   printf("done.\n");
   return 0;
}

当你运行程序时,你会在地址0x41414141崩溃,因为读取文件导致溢出并且返回地址被覆盖。

在这种类型的漏洞利用中,您的shellcode将在开头具有特定的返回地址,
指向易受攻击的可执行文件中的某个位置,而不是跳回到堆栈上的shellcode(jmp esp)。

但请注意,最有可能的是,这不适用于现代编译器,因为他们添加了security checks来防止这种情况, 因此,如果您想尝试它,则必须在编译器中禁用这些选项。

您可能还想了解有关Buffer Overflow

的更多信息

希望有所帮助!