如何用特定的返回地址溢出缓冲区?

时间:2018-10-15 21:09:53

标签: c stack-overflow buffer-overflow

这是我得到的一个数组:

var savedUrl='';
browser.url(function(result){
  savedUrl=result.value;
})

这是地址: char overflow[16]="\xEF\xBE\xAD\xDE\xEF\xBE\xAD\xDE" "\xEF\xBE\xAD\xDE\xEF\xBE\xAD\xDE";

如何编辑上面的数组以溢出并将返回地址更改为上面的新地址?

1 个答案:

答案 0 :(得分:0)

这实际上取决于堆栈上的内容,堆栈决定了您至少必须重写多少个字节。函数参数和局部变量将成为堆栈指针的方式,这是您尝试覆盖的正确方法吗?我会说用1k的相同重复字节模式溢出它,并与gdb或其他调试器一起执行以获得堆栈跟踪。

ex1。 (您需要写完数组sizeof(int)个字节才能到达堆栈指针。)

void testFunction(int arg0){
  char overflow[16] = {0};
  char HUGE_ARRAY[10000] = {0};// what does the stack look like in this case?  This giant block of memory should be on the stack AFTER your target array
  //do something that allows the user to overflow the overflow array for w/e reason
}

ex2。 (您需要写完数组sizeof(int)个字节+ 10000个字节才能到达堆栈指针。)

void testFunction(int arg0){
  char HUGE_ARRAY[10000] = {0};// what does the stack look like in this case?  This giant block of memory should be on the stack BEFORE your target array.
  char overflow[16] = {0};
  //do something that allows the user to overflow the overflow array for w/e reason
}

如果您知道目标环境(例如,已知sizeof int),函数参数的数量和类型以及输入试图覆盖的函数的堆栈中弹出的局部变量的数量和类型,那么堆栈指针,那么从理论上讲,您可以写出函数堆栈指针的确切字节。

或者,您可以通过在溢出缓冲区之后写入0x00值并每次将距离PAST增加16个字节来解决这一问题,直到您对故障进行分段。一旦发现错误,就可以找到函数的堆栈指针。

通常,通过按以下顺序弹出以下内容来增加堆栈:返回地址->函数参数-> Locals。

在您的情况下,可以通过写入比所需更多的字节来测试它。 (只要将<4k分配给此函数堆栈,然后在堆栈上弹出溢出,就可以使用)

for (offset = 0; offset < 1000; offset++){
  (int)(*overflow + 4 + offset) = 0x1234B000;
}

GL。