使用缓冲区溢出攻击修改返回地址

时间:2014-02-21 16:12:28

标签: c security buffer-overflow

所以我试图修改这个函数的返回地址,使它永远运行。我意识到我需要使用函数的地址来更改返回地址,这样它将永远循环。

这是代码

void win(char * arg)
{

    char name[16];
    char * stuff[4] = {"TV", "Phone", "Car", "Cash"};

    strcpy(name, arg);
    printf("Your name is %s:\n", name);
    printf("Here you can use this to win %s!\n", stuff[rand()%4]);
    printf("Here is the number %d\n\n", rand());
}

arg只是argv[1]

我使用gdb获取win函数的地址,即0x8048530。我使用info frame命令查看保存的eip(返回地址是否正确?),它是0x804862c。我相信要到达我需要溢出的返回地址name[]。我猜我可以计算一下如何计算我可以插入win的地址以覆盖返回函数。像name[23]这样的东西。 name[0]地址0xbffffaa0 name[16]地址为0xbffffab0。 arg的地址是0xbffffac0。这就是我所知道的所有信息。我正在努力将所有这些放在一起引发攻击。显然,如果我导致名称溢出,它将进入东西,但我需要更改返回地址,所以我需要走另一条路。我怎么能使用缓冲区溢出攻击来做到这一点

1 个答案:

答案 0 :(得分:0)

通过溢出name,你将破坏它后面的局部变量,在这种情况下stuff。 为了重写返回地址,您需要返回堆栈,而不是转发。

This回答有一个很好的堆栈布局草图。