c - 缓冲区溢出攻击格式

标签 c security x86 buffer-overflow shellcode

通常我们都看到基本的缓冲区溢出格式有:- NOPs + shellcode + return_address

我们为什么不使用, NOPs + return_address + shellcode?我们在哪里使返回地址指向 shellcode 的开头?

我猜这是因为如果漏洞在 main() 中,我们可能会尝试在堆栈段之外写入数据。我对吗?如果我是,这是唯一的原因吗?

哦,是的,我指的不是使用 return-to-libc、ptrace 等的其他类型的攻击;我只是想知道为什么最基本的缓冲区溢出攻击都以第一种方式进行演示,而不是到处都是第二种方式。

最佳答案

返回地址可以在shellcode+nop sled之前或之后。例如,如果您正在写入一个靠近堆栈顶部的变量,您可能必须将 nop sled+shell code 写入返回地址 (EIP) 之后,因为可能没有足够的空间。

但是,NOP sled 将始终位于 shell 代码旁边。原因是因为您使用 nop sled 使 shell 代码的目标尽可能大。如果您的 EIP 从您的 shell 代码指向 +=100 字节,那么您需要使用超过 100 字节的 nop sled 来保证您会达到目标。因此 NOPs + return_address + shellcode 是无效的。一个常见的漏洞利用字符串如下所示:

JUNK + return_address + NOPs + shellcode

当然,“return-to-libc” 风格的攻击不需要 shellcode 或 nop sled。

这种简单的基于堆栈的缓冲区溢出漏洞利用在现代系统上不起作用。 Alpeh-One 的 Smashing The Stack For Fun and Profit 不再有效,因为 NX 区域、堆栈金丝雀和 ASLR,所有这些在 Windows 和 Linux 上都是默认设置。

你应该拿起一份:

enter image description here

关于c - 缓冲区溢出攻击格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5287874/

相关文章:

c - 为什么在输入一些文本并按下 "enter"键 (EOF) 后 printf 语句不在这里执行?

c - 为什么 gst_app_src_get_size 总是返回 -1 但总的来说一切正常?

php - 使用 PDO 省略 bindParam 安全吗?

apache - 内容安全策略 : allowing all external images?

oop - 如何通过查看程序集来判断程序是否使用动态调度

c++ - 优化 block 位操作 : base-4 numbers

c - 将用户输入存储到两个数组时中止陷阱

c - 忽略 scanf 格式中的空格

java - 在哪里存储 secret 信息?

c - 如何在汇编中使用 float ?