Pwn ret2shellcode in x86
原理
shellcode
shellcode 指达到某种目的的 (二进制) 代码片段, 在 pwn 中一般指获取 shell 的指令.
下面以调用函数 execve("/bin/sh",0,0) 的 shellcode 来举例说明.
shellcode 面向的对象是 CPU, 就是系统能够直接执行的指令. 所以一般而言, 是一串二进制代码. 这串代码其实就是机器指令. 写一个获得 shell 的汇编程序, 然后 hexdump 一下, 得到的二进制数据, 就是 shellcode 了.
shellcode 的编写
不会. 这涉及到了汇编和系统调用, 没怎么深入学习过.
同样是获得 shell, 不同人可能有不同的写法, 就像其他任何一门语言一样. 这就导致了 shellcode 的长度并不是固定的. 有时候我们需要更短的 shellcode.
shell-storm.org 收录了许多 shellcode, 可以直接使用. 目前 x86 32 位最短的 execve("/bin/sh",0,0) shellcode 是 21 (0x15) 个字节.
需要注意的一点是, shellcode 如果放在堆或者一些段上, 在读取的时候, 碰到 \0x00 就会停. 这称为 坏字符, 在编写 shellcode 的时候需要避免. 如果是栈上的 shellcode, 好像没有这个要求 (应该吧, 不是很懂), 可能可以编写更短的 shellcode.





