我需要找到以下指令的无空替换,以便我可以将以下代码放入 shellcode。
我需要转换为无空值的第一条指令是:
mov ebx, str ; the string containing /dev/zero
字符串 str 在我的 .data 部分中定义。第二个是:
mov eax,0x5a
谢谢!
假设你想学习的是汇编代码是如何构成的,什么样的指令选择最终会出现在具有特定属性的汇编代码中,那么(在 x86/x64 上)执行以下操作:
拿起英特尔的指令集参考手册(我认为在撰写本文时有四卷)。它们包含操作码表(指令二进制格式),以及特定程序集助记符(指令名称)的所有允许操作码的详细列表。
熟悉这些并在心理上将它们分为两组 - 那些与您的预期属性匹配的组(例如,不包含“x”字符......或任何其他特定的字符),以及不包含的那些。如果它们存在,则需要从代码中消除第二类。
编译您的代码,告诉编译器不要丢弃编译中间体:
gcc -save-temps -c csource.c
objdump -d csource.o
反汇编输出objdump
将包含二进制指令(操作码)以及指令名称(助记符),即您将准确看到选择了哪种操作码格式。您现在可以根据上面的 1. 检查其中是否有来自第二组的任何操作码。
这项工作的创造性部分现在出现了。当您在反汇编输出中发现与您的期望/要求不匹配的指令时,查找/创建一个替代(或者,更常见的是,多个指令的替代序列),它给出相同的最终结果,但仅由符合您需要的说明组成。
从上面返回到编译中间体,找到csource.s
程序集,进行更改,重新组装/重新链接,测试。
如果您想使您的汇编代码独立(即不使用系统运行时库/直接进行系统调用),请查阅有关您的操作系统内部的文档(如何进行系统调用),和/或反汇编通常这样做的运行时库代表,了解它是如何完成的。
由于 5. 绝对是家庭作业,就像创建一个for()
与给定while()
循环等效的 C 循环一样,不要指望那里有太多帮助。指令集参考手册和(反)汇编程序的实验是您需要的。
Additionally, if you're studying, attend lessons on how compilers work / how to write compilers - they do cover how assembly instruction selection is done by compilers, and I can well imagine it to be an interesting / challenging term project to e.g. write a compiler whose output is guaranteed to contain the character '?
' (0x3f
) but never '!
' (0x21
). You get the idea.
您提到恒定负载通过xor
清除加号inc
并shl
获得您想要的任何一组位。
我能想到的加载未知常量(你的未知数)的最不脆弱的方法是加载具有某个值str
的常量,例如,然后在后续指令中退出。例如加载:xor
0xAAAAAAAA
xor
0x1234
0: 89 1d 9e b8 aa aa mov %ebx,0xaaaab89e
6: 31 1d aa aa aa aa xor %ebx,0xaaaaaaaa
您甚至可以选择0xAAAAAAAA
一些有趣的 ascii!