我需要在挑战应用程序中使用缓冲区溢出对目标文件执行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并跳转到该函数,但这对我来说很糟糕。我从来没有为数组设置堆栈,也找不到在经典缓冲区溢出中使用数组的谷歌示例。
如何为函数调用设置包含数组参数的堆栈?在这种情况下,我的堆栈需要看起来像什么?
答案 0 :(得分:1)
假设x86和cdecl,你必须在堆栈上推送参数。至于要传递什么值,你必须将指针传递给你的数组。上面的字符串布局将保持不变。
旁注:在字符串布局中,它不是EIP,而是前一帧中保存的EBP值。