4

我需要找到以下指令的无空替换,以便我可以将以下代码放入 shellcode。

我需要转换为无空值的第一条指令是:

mov ebx, str    ; the string containing /dev/zero

字符串 str 在我的 .data 部分中定义。第二个是:

mov    eax,0x5a

谢谢!

4

2 回答 2

4

假设你想学习的是汇编代码是如何构成的,什么样的指令选择最终会出现在具有特定属性的汇编代码中,那么(在 x86/x64 上)执行以下操作:

  1. 拿起英特尔的指令集参考手册(我认为在撰写本文时有四卷)。它们包含操作码表(指令二进制格式),以及特定程序集助记符(指令名称)的所有允许操作码的详细列表。
    熟悉这些并在心理上将它们分为两组 - 那些与您的预期属性匹配的组(例如,不包含“x”字符......或任何其他特定的字符),以及不包含的那些。如果它们存在,则需要从代码中消除第二类。

  2. 编译您的代码,告诉编译器不要丢弃编译中间体:

    gcc -save-temps -c csource.c

  3. 反汇编目标文件:
    objdump -d csource.o
  4. 反汇编输出objdump将包含二进制指令(操作码)以及指令名称(助记符),即您将准确看到选择了哪种操作码格式。您现在可以根据上面的 1. 检查其中是否有来自第二组的任何操作码。

  5. 这项工作的创造性部分现在出现了。当您在反汇编输出中发现与您的期望/要求匹配的指令时,查找/创建一个替代(或者,更常见的是,多个指令的替代序列),它给出相同的最终结果,但仅由符合您需要的说明组成。
    从上面返回到编译中间体,找到csource.s程序集,进行更改,重新组装/重新链接,测试。

  6. 如果您想使您的汇编代码独立(即不使用系统运行时库/直接进行系统调用),请查阅有关您的操作系统内部的文档(如何进行系统调用),和/或反汇编通常这样做的运行时库代表,了解它是如何完成的。

由于 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.

于 2011-07-28T09:45:09.437 回答
1

您提到恒定负载通过xor清除加号incshl获得您想要的任何一组位。

我能想到的加载未知常量(你的未知数)的最不脆弱的方法是加载具有某个值str的常量,例如,然后在后续指令中退出。例如加载:xor0xAAAAAAAAxor0x1234

   0:   89 1d 9e b8 aa aa       mov    %ebx,0xaaaab89e
   6:   31 1d aa aa aa aa       xor    %ebx,0xaaaaaaaa

您甚至可以选择0xAAAAAAAA一些有趣的 ascii!

于 2011-07-28T05:49:31.900 回答