堆栈缓冲区溢出如何用包含null字符的值覆盖本地变量



我正试图找到一种方法来覆盖包含以下代码的函数的返回地址:

length=大于目标大小,但小于从目标数组开始的返回地址偏移量。

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

参数是我从输入中传入的内容。

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

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

我需要将i重写为小于300(0x12c)的某个数字,将length重写为大于300的某个数量。

由于这是32位系统,0x0000012c整数包含空字符,所以我无法通过参数将其传入。

在这种情况下,有没有办法覆盖返回地址?

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

在大多数情况下,您不能写入空字节,例如缓冲区溢出是由strcpy()等不安全的字符串函数引起的。在这种情况下,您使用for循环移动字节,因此如果您可以影响长度值(该值可能在堆栈上…),则可能复制空字节。

另一种可能性是查看数据类型。如果它是有符号的,那么非常大的值将被解释为负数。尽管在这次攻击中,你覆盖了一个数值,但还是要复习一下"算术溢出"。

最新更新