我正在尝试编写一些最终将以英文段落形式出现的shellcode。这意味着我主要限于指令的操作码为字母数字字符或标点符号。实际上,这给我留下了许多不同的跳转指令,包括:jo
,jno
,jb
,jae
,je
,jne
,jbe
,ja
,js
,jns
和jp
(对应于字母p-z
)。这些跳跃中的每一个都会在决定是否跳跃之前执行测试。在大多数情况下,我可以结合使用跳转及其反函数来确保将在shellcode中进行跳转(例如,先使用jo
然后使用jno
,或者先使用je
然后使用jne
),但是对于jb
则无法执行此操作。 jb
的测试是CF=1
。
我的问题是,在功能上是否有一系列字母数字的指令是NOP,但也可以确保CF=1
? CF
是进位标志,因此可以保证进行任何设置进位标志的操作。
同样要确保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
的警告。它对大多数算术标志的影响是不确定的(CF
和AF
除外,它们变得相等)。因此,它也不完全是“NOP”。
关于assembly - 字母数字Shellcode确保跳转,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10637394/