XOR如何防止shellcode中的NULL字节

ak1*_*652 0 c assembly execve shellcode

我一直在尝试按照本教程(https://paraschetal.in/writing-your-own-shellcode)来编写自己的shellcode.其中99%对我有意义,但我心中只有两个疑惑 - 这与编写shellcode有关

首先,我想我明白为什么我们要避免空字节但是如何使用以下避免空字节?

xor eax, eax
Run Code Online (Sandbox Code Playgroud)

eax现在不包含完全空字节?或者它包含0?当我们对自己进行异或时,它会返回False,对吗?

其次,教程说:

最后,我们将把系统调用号(11或0xb)加载到eax寄存器.但是,如果我们在指令中使用eax,生成的shellcode将包含一些NULL(\ x00)字节,我们不希望这样.我们的eax寄存器已经是NULL.因此,我们只需将系统调用号加载到al寄存器而不是整个eax寄存器.

mov byte  al, 0x0b
Run Code Online (Sandbox Code Playgroud)

现在我明白了这里发生了什么,数字11(for execve)被加载到eax寄存器的前8位(即al).但其余的eax仍然包含空字节,那么究竟是什么在这里实现的?

请注意,在我花了大部分时间试图理解这一点后,我作为最后的手段来到这里,所以请放轻松我:)

Ant*_*ala 5

攻击通常会攻击C代码,因此shell代码通常需要以NUL终止的字符串形式提供.如果shell代码包含NUL字节,则被利用的C代码可能会忽略并从第一个零字节开始删除其余代码.

这仅涉及机器代码.如果需要使用数字0xb调用系统调用,那么自然需要能够在EAX寄存器中生成数字0xb,但是您只能在机器代码本身中使用那些不包含零字节的机器代码形式.


xor eax, eax
Run Code Online (Sandbox Code Playgroud)

将反转所有的1 位的eax,也就是零了.它是一个功能相当于

mov eax, 0
Run Code Online (Sandbox Code Playgroud)

除了后者将在机器代码中将0编码为零字节.


机器代码

xor eax, eax
mov byte al, 0x0b
Run Code Online (Sandbox Code Playgroud)

是

31 c0 b0 0b
Run Code Online (Sandbox Code Playgroud)

如您所见,其中没有嵌入的零字节.机器代码

mov eax, 0xb
Run Code Online (Sandbox Code Playgroud)

是

b8 0b 00 00 00
Run Code Online (Sandbox Code Playgroud)

这两个程序在功能上都是等效的,因为它们将EAX寄存器的值设置为0xb.

如果后一个shell代码由C程序作为以null结尾的字符串处理,则其后的其余部分b8 0b 00可被程序丢弃并被内存中的其他字节替换,从而使shellcode无效.

  • @ ak1652**唯一的问题是shell代码不能包含空字节.要在不使用数字"0"的情况下写入值"0",可以写入1-1.结果仍为0.*我们想要0结果*.同样,EAX将包含空字节,因为我们希望它具有.我们的任务是在*写*时不使用数字0.** (2认同)