在堆栈上传递数组参数(缓冲区溢出)

Passing array parameters on the stack (Buffer Overflow)

我需要在挑战应用程序中使用缓冲区溢出在目标文件上执行对 cat 的调用(无法在堆栈上执行,但可以使用 libc)。作为参考,在 C 中,这是我正在尝试执行的操作的有效代码:

int main(void) {
        char * const argv[] = {"cat", "/etc/target/file"};
        char * const envp[] = {NULL};;
        execve("/bin/cat", argv, envp);
}

我可以在目标上加载一些以 null 结尾的字符串,我还确定了 execve 的地址。这是我掌握的信息:

"/bin/cat" @ 0xbfffffb9:
"cat" @ 0xbfffffbe
"/etc/target/file" @ 0xbffff96f

execve @ 0x804831c

我可以用类似这样的字符串覆盖 EIP 和后面的字节:

"AAAA....AAA" + EIP + [RETURN ADDR] + ARG1 + ARG2 ....

在上面的字符串中,我可以将 EIP 替换为 execve 的地址并跳转到该函数,但这对我来说很糟糕。我从未为数组设置堆栈,也找不到 google 在经典缓冲区溢出中使用数组的示例。

如何为我的函数调用设置带有数组参数的堆栈?在这种情况下,我的堆栈需要是什么样的?

假设 x86 和 cdecl,您将不得不将参数压入堆栈。至于要传递什么值,您必须将指针传递给您的数组。上面的字符串布局将保持不变。

旁注:在您的字符串布局中,它不是 EIP,而是上一帧保存的 EBP 值。