我正试图找到一种方法来覆盖包含以下代码的函数的返回地址:
length=大于目标大小,但小于从目标数组开始的返回地址偏移量。
for (i = 0; i <= length; i++)
target[i] = argument[i];
参数是我从输入中传入的内容。
局部变量length足够大,我可以溢出参数来覆盖I和length。
假设返回地址与目标起始地址的偏移量为300。
我需要将i
重写为小于300(0x12c)的某个数字,将length
重写为大于300的某个数量。
由于这是32位系统,0x0000012c整数包含空字符,所以我无法通过参数将其传入。
在这种情况下,有没有办法覆盖返回地址?
听起来像是一个缓冲区溢出挑战。
在大多数情况下,您不能写入空字节,例如缓冲区溢出是由strcpy()等不安全的字符串函数引起的。在这种情况下,您使用for循环移动字节,因此如果您可以影响长度值(该值可能在堆栈上…),则可能复制空字节。
另一种可能性是查看数据类型。如果它是有符号的,那么非常大的值将被解释为负数。尽管在这次攻击中,你覆盖了一个数值,但还是要复习一下"算术溢出"。