【发布时间】:2011-07-13 22:33:52
【问题描述】:
我想跳过C语言中的一行,主要部分中的x=1;行使用bufferoverflow;但是,我不知道为什么我不能将地址从4002f4 跳过到下一个地址4002fb,尽管我从<main+35> 到<main+42> 计算了7 个字节。
我还在 Debian 和 AMD 环境中配置了 randomniZation 和 execstack 环境选项,但我仍然收到x=1;。这个过程有什么问题?
我用dba调试过栈和内存地址:
0x00000000004002ef <main+30>: callq 0x4002a4 **<function>**
**0x00000000004002f4** <main+35>: movl $0x1,-0x4(%rbp)
**0x00000000004002fb** <main+42>: mov -0x4(%rbp),%esi
0x00000000004002fe <main+45>: mov $0x4629c4,%edi
void function(int a, int b, int c)
{
char buffer[5];
int *ret;
ret = buffer + 12;
(*ret) += 8;
}
int main()
{
int x = 0;
function(1, 2, 3);
x = 1;
printf("x = %i \n", x);
return 0;
}
【问题讨论】:
-
我不确定我是否应该帮助您调试您的攻击策略,但您应该转储
x/i10堆栈$esp并将其添加到您的解释中。还显示当您从function开始向前执行指令时会发生什么 -
我建议您忽略程序的输出,并在调试器中单步执行它,一次一条汇编指令。您将在每一步看到它实际在做什么(寄存器值、堆栈),这将告诉您为什么它没有按照您的预期进行。
-
请解释你为什么要这样做。
-
过去,恶意软件作者在早餐前写了缓冲区溢出。现在他们在 Stackoverflow 上发布问题。我问世界也将要发生什么?
-
@jim:根据我的教授的说法,这是一个老问题,大多数操作系统都有避免这种攻击的策略,我只是一个试图了解指针如何通过寄存器移动的学生
标签: c buffer-overflow cracking