我需要为以下指令找到无空位替换,以便将以下代码放在shellcode中。
我需要转换为null-free的第一条指令是:
mov ebx, str ; the string containing /dev/zero
字符串str在我的.data部分中定义。 第二个是:
mov eax,0x5a
谢谢!
答案 0 :(得分:4)
假设你想要学习的是汇编代码是如何组成的,那么在具有特定属性的汇编代码中最终会出现什么类型的指令选择,然后(在x86 / x64上)执行以下操作:
拿起英特尔的指令集参考手册(我认为在撰写本文时有四卷)。它们包含操作码表(指令二进制格式),以及特定组件助记符(指令名称)的所有允许操作码的详细列表。
熟悉这些并将它们精神分为两组 - 那些符合您预期属性的组(例如,不包含'x'字符......或任何其他特定属性),以及那些不符合预期属性的组。如果存在代码,则需要从代码中删除第二类。
编译代码告诉编译器不要丢弃编译中间体:
gcc -save-temps -c csource.c
objdump -d csource.o
objdump
的反汇编输出将包含二进制指令(操作码)以及指令名称(助记符),即您将确切地看到哪个操作码格式是选择。您现在可以检查第2组中的任何操作码是否符合上述1.
这项工作的广告位现在就出现了。如果您在反汇编输出中发现不符合您的期望/要求的指令,请查找/创建替代(或更常见的是,几个指令的替代序列)给出相同的最终结果,但仅由 匹配您需要的指令组成
回到上面的编译中间体,找到csource.s
程序集,进行更改,重新组装/重新链接,测试。
如果您想使汇编代码独立(即不使用系统运行时库/直接进行系统调用),请查阅操作系统内部的文档(如何进行系统调用)和/或反汇编运行时库通常是代表您这样做,以了解它是如何完成的。
由于5.肯定是家庭作业,与创建一个等同于给定for()
循环的C while()
循环相同,不要指望那里有太多帮助。您需要的是指令集参考手册和(dis)汇编程序的实验。
此外,如果您正在学习,参加有关编译器如何工作/如何编写编译器的课程 - 它们确实涵盖了编译器如何完成汇编指令选择,我可以想象它是一个有趣/具有挑战性的术语项目。例如编写一个编译器,其输出保证包含字符“?
”(0x3f
)但从不“!
”(0x21
)。你明白了。
答案 1 :(得分:1)
您通过xor
提及常量加载以清除加号inc
和shl
以获取您想要的任何位数。
我能想到的加载未知常量(您的未知str
)的最不易碎的方法是加载常量xor
,其值为0xAAAAAAAA
,然后是{{1}在后续指令中退出。例如,要加载xor
:
0x1234
您甚至可以选择 0: 89 1d 9e b8 aa aa mov %ebx,0xaaaab89e
6: 31 1d aa aa aa aa xor %ebx,0xaaaaaaaa
作为一些有趣的ascii!