将数组传递给函数调用(缓冲区溢出)

逆向工程 拆卸 缓冲区溢出 堆栈变量
2021-06-11 03:58:57

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

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

我可以在目标上加载一些以空字符结尾的字符串,并且我还确定了execve. 这是我掌握的信息:

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

execve @ 0x804831c

我可以用EIP如下字符串覆盖以下字节:

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

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

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

1个回答

你实际上在做什么是传递指向数组的指针,而不是数组本身。如果您查看声明:

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

'argv' 和 'envp' 是指向数组的指针。

通常,最简单的方法是 ROP 到 execve('command', NULL, NULL) 以避免花哨的设置。为什么不 execve('/bin/bash', NULL, NULL) 然后从生成的 shell 中 cat 文件?

否则,您可以设置一些指针以使其工作 - 将指针传递给包含您的参数的 NULL 指针终止的字符串数组。