2012-01-28 65 views
2

我试图想出一个办法来覆盖包含此代码的函数的返回地址,局部变量:堆栈缓冲区溢出如何覆盖包含null值的字符

长度=比目标尺寸比返回地址大,但小从目标数组开始偏移。

for (i = 0; i <= length; i++) 
    target[i] = argument[i]; 

论证是我从输入传递。

局部变量长度足够大,我可以溢出参数来覆盖i和长度。

假设返回地址从目标的起始地址偏移量为300

我需要覆盖i比300(0x12c)和length小一些数比300

更大一些号码

由于这是32位系统,0x0000012c整数包含空字符,所以我不能通过参数传入它。

在这种情况下,有覆盖返回地址的方法吗?

回答

1

听起来像是缓冲区溢出挑战。

在大多数情况下,您无法编写空字节,例如缓冲区溢出是由不安全的字符串函数之一(如strcpy())引起的。在这种情况下,您正在使用for循环移动字节,所以如果您可以影响长度值(此值可能在堆栈中...),则可能会复制空字节。

另一种可能性是查看数据类型。如果它被签名,那么非常大的值将被解释为负数。刷上“算术溢出”,虽然在这次攻击中你正在覆盖一个数值。