【问题标题】:how to build up a buffer overflow payload如何构建缓冲区溢出有效负载
【发布时间】: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


【解决方案1】:

AAAA 是因为在进入flag 时,它期望栈顶包含它的返回地址,参数从其后 4 个字节开始。你不关心flag能否返回,所以你只需要4个字节的垃圾来代替返回地址。

至于\r,它不在参数之间(它们在内存中应该是相邻的,它们之间不能有任何字节);相反,它实际上是第二个参数的第一个(最低有效)字节。 ASCII 回车符\r 有数值0x0d,所以你的参数是0xdeadbeef, 0xc0ded00d。我不知道他们为什么将低字节写为\r 而不是\x0d,这样会更一致。也许它是由某些程序自动从二进制转换为十六进制转义的。

【讨论】:

    猜你喜欢
    • 2016-10-10
    • 2016-09-19
    • 2015-12-16
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2011-01-20
    相关资源
    最近更新 更多