我正在尝试编写一些最终将以英文段落形式出现的shellcode。这意味着我主要限于指令的操作码为字母数字字符或标点符号。实际上,这给我留下了许多不同的跳转指令,包括:jojnojbjaejejnejbejajsjnsjp(对应于字母p-z)。这些跳跃中的每一个都会在决定是否跳跃之前执行测试。在大多数情况下,我可以结合使用跳转及其反函数来确保将在shellcode中进行跳转(例如,先使用jo然后使用jno,或者先使用je然后使用jne),但是对于jb则无法执行此操作。 jb的测试是CF=1

我的问题是,在功能上是否有一系列字母数字的指令是NOP,但也可以确保CF=1CF是进位标志,因此可以保证进行任何设置进位标志的操作。

同样要确保jae,是否仍要确保CF=0呢?

最佳答案

您可以使用“4444” CF设置为0。

“44” XOR AL, 0x34

2个具有相同值的XORs不会导致AL更改。

但应注意,XOR影响几乎所有算术标志(对AF的影响未定义)。因此,它不是完全“NOP”。

在32位模式下,您可以使用“PhohohX7X” CF设置为1。

“P” PUSH EAX
“hohoh” PUSH 0x686F686F
“X” POP EAX
“7” AAA
“X” POP EAX

还有一个关于AAA的警告。它对大多数算术标志的影响是不确定的(CFAF除外,它们变得相等)。因此,它也不完全是“NOP”。

关于assembly - 字母数字Shellcode确保跳转,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10637394/

10-13 01:00