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

时间:2015-07-10 22:59:53

标签: stack buffer-overflow disassembly exploit

我需要在挑战应用程序中使用缓冲区溢出对目标文件执行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 ....

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

如何为函数调用设置包含数组参数的堆栈?在这种情况下,我的堆栈需要看起来像什么?

1 个答案:

答案 0 :(得分:1)

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

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