【发布时间】:2018-12-29 18:43:39
【问题描述】:
我一直在尝试按照本教程 (https://paraschetal.in/writing-your-own-shellcode) 学习如何编写自己的 shellcode。 99% 对我来说是有意义的,但我心中只有两个挥之不去的疑虑——这与一般编写 shellcode 有关
首先,我想我理解为什么我们要避免空字节,但是如何使用以下避免空字节?
xor eax, eax
eax 现在不包含完全空字节吗?还是它包含 0?当我们与自身异或时,它返回 False,对吗?
其次,教程说:
最后,我们将系统调用号(11 或 0xb)加载到 eax 登记。但是,如果我们在指令中使用 eax,则结果 shellcode 将包含一些 NULL(\x00) 字节,我们不希望这样。 我们的 eax 寄存器已经是 NULL。所以我们只加载系统调用 编号到 al 寄存器而不是整个 eax 寄存器。
mov byte al, 0x0b
现在我明白这里发生了什么,数字 11(代表 execve)正在加载到 eax 寄存器(即 al)的前 8 位。但是eax 的其余部分仍然包含空字节,那么这里究竟实现了什么?
请注意,在花了一天的大部分时间试图理解这一点之后,我作为最后的手段来到这里,所以请放轻松:)
【问题讨论】:
-
重点是避免机器码本身的零字节,而不是运行时的寄存器中。如果你写
mov eax, 0,它的有效载荷中将包含零。xor eax, eax恰好有一个不包含零字节的机器代码,但在运行时它会根据需要生成一个零。只需为两个版本创建有效负载并观察零字节。 -
您说您“完全理解”为什么要避免空字节然后将它们与寄存器值混淆...
-
抱歉,将编辑。
标签: c assembly shellcode execve