我正在尝试编写一些最终将采用英文段落形式的shellcode。这意味着我主要限于具有评估字母数字字符或标点符号的操作码的指令。这实际上给我留下了许多不同的跳转说明,包括:jo
,jno
,jb
,jae
,je
,jne
,{{1 },jbe
,ja
,js
和jns
(对应于字母jp
)。这些跳转中的每一个在决定跳跃之前都会执行测试。在大多数情况下,我可以组合跳转加反转,以确保在shellcode中发生跳转(例如使用p-z
然后jo
,或jno
然后je
),但在jne
的情况下,我不能这样做。 jb
的测试为jb
。
我的问题是,是否存在一系列功能上属于NOP的字母数字指令,但也确保CF=1
? CF=1
是进位标志,因此任何保证设置进位标志的操作都足够了。
同样要确保CF
,无论如何要确保jae
?
答案 0 :(得分:6)
您可以使用“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”。