我读了一本关于缓冲区溢出的书,它建议处理方法如下:
将堆栈(和堆)设置为不可执行可以为现有程序提供高度保护,以防止许多类型的缓冲区溢出攻击。
但我不理解怎么做 - 如果不在堆或栈上执行,那么执行会发生在哪里?
我读了一本关于缓冲区溢出的书,它建议处理方法如下:
将堆栈(和堆)设置为不可执行可以为现有程序提供高度保护,以防止许多类型的缓冲区溢出攻击。
但我不理解怎么做 - 如果不在堆或栈上执行,那么执行会发生在哪里?
有一种被称为“返回导向编程”(ROP)的漏洞利用技术。
攻击者找到了如何将他的恶意代码组合成正在被攻击的程序的不同部分的方法。
攻击者查找可以在返回指令字节之前执行对寄存器或内存执行有用操作,例如将值移动到位置、添加值、比较值等的可用字节序列(指令)。这些是构建漏洞利用的微型子例程。
然后,通过利用代码错误,攻击者迫使程序开始执行这些微小子例程链,从而完成所有恶意工作。
因此,现在优秀代码变成了恶意代码。没有任何东西在堆栈或堆中执行。
还值得注意的是,在指令跨越多个字节且长度可变的CPU上,即使是指令的立即操作数(换句话说,数值常量)也可以成为代码,因此在那里找到可用的字节序列的机会更高。
通常还可以构造恶意代码来改变内存保护,使漏洞利用不再受现有应用程序代码的限制。
system
,并将栈上的下一个槽位(或按寄存器传递的结构中的第一个参数寄存器)设置为指向字符串 "/bin/sh"
的指针。"/bin/sh"
更改为 "/bin/sh 0<&n"
,其中 n
是您连接的服务器套接字的文件描述符号码。 - R.. GitHub STOP HELPING ICE"echo 'toor::0:0::/:/bin/sh' >> /etc/passwd"
。 - R.. GitHub STOP HELPING ICE您的代码运行在文本段中,而不是堆栈或堆中(两者都用于数据存储)。因此,组织方式是:
<highest addresses>
stack
...
heap
data section (initialized data & bss - uninitialized data)
code section (text)
<lowest addresses>
这种保护是由操作系统提供的,无法在应用程序层面完成。
请参阅维基百科文章,该文章还介绍了如何在Windows下启用它:http://en.wikipedia.org/wiki/Data_Execution_Prevention
你可以跳转到任何可执行段并运行你的恶意代码...
毕竟,任何存储器上的数据都是比特,而比特可以成为指令传递给CPU执行。
你可以利用溢出来覆盖函数的返回地址,从而跳转到一些已知的带有你代码的地址。但是操作系统的开发者们采取了随机化地址执行代码的方式来应对这种攻击...