我在这里阅读了一篇关于编写shellcode(使用stack方法执行)的基础文章:http://hackoftheday.securitytube.net/2013/04/demystifying-execve-shellcode-stack.html
在步骤6中:它推送一个空字符,因为字符串“/bin/sh”是以空终止的。
为什么字符串以相反的顺序被推入堆栈,为什么终止字符串的空字符在将字符串推入堆栈”之前“被推入?
我在这里阅读了一篇关于编写shellcode(使用stack方法执行)的基础文章:http://hackoftheday.securitytube.net/2013/04/demystifying-execve-shellcode-stack.html
在步骤6中:它推送一个空字符,因为字符串“/bin/sh”是以空终止的。
为什么字符串以相反的顺序被推入堆栈,为什么终止字符串的空字符在将字符串推入堆栈”之前“被推入?
1条答案
按热度按时间dphi5xsq1#
应放入堆栈的字符串如下:
要做到这一点,我们必须以正确的顺序执行一组指令:
为什么要按这样的顺序?
因为堆栈的性质。元素应该以相反的顺序放入其中,以便将来正确地从其中读出。堆栈是一种数据结构,它具有先进后出(FILO)顺序(与堆相反)。这意味着第一个放入堆栈的项目是最后一个从堆栈中出来的项目。随着堆栈大小的变化,它会向更低的内存地址向上增长:
现在,这两个双字怎么样:
0x68732f6e (hs/n)
和0x69622f2f (ib//)
?它们与//bin/sh
有什么关系?查看
0x68732f6e
,我们可以看到逐字节显示的字节反转效果,实际存储在内存中,4个字节:0x6e 0x2f 0x73 0x68 (n/sh)
。它与IA-32体系结构特定的endianess相关联,在手动将字节放入堆栈时必须考虑到这一点。在x86处理器上,值以little-endian(与SPARC处理器上的big endian相反)字节顺序存储,这意味着最低有效字节首先存储(小端在前):将在内存中排列如下:
最后,为了直观地了解内存空间是如何填充的,请看下面的内容:
您可以使用gdb查看: