我需要为以下说明找到无空值的替代品,以便我可以将以下代码放入 shellcode。

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

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

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

谢谢!

最佳答案

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

  • 查阅 Intel 的指令集引用手册(我认为在撰写本文时有四卷)。它们包含操作码表(指令二进制格式),以及特定程序集助记符(指令名称)的所有允许操作码的详细列表。
    熟悉这些并在心理上将它们分为两组 - 那些与您的预期属性匹配的组(例如,不包含“x”字符......或任何其他特定的字符),以及那些不匹配的组。如果它们存在,您需要从代码中消除的第二类。
  • 编译你的代码告诉编译器不要丢弃编译中间体:gcc -save-temps -c csource.c
  • 反汇编目标文件:objdump -d csource.o
  • objdump 的反汇编输出将包含二进制指令(操作码)以及指令名称(助记符),即您将确切地看到选择的操作码格式。您现在可以根据上面的 1. 检查其中是否有任何操作码来自第二组。
  • 作品的创意部分现在出现了。当您在反汇编输出中发现与您的期望/要求不匹配的指令时,查找/创建一个替代品(或者,更常见的是,多个指令的替代序列)给出相同的最终结果,但仅由符合您需要的说明组成。
    从上面返回编译中间体,找到 csource.s 程序集,进行更改,重新组装/重新链接,测试。
  • 如果你想让你的汇编代码独立(即不使用系统运行时库/直接进行系统调用),请查阅操作系统内部的文档(如何进行系统调用),和/或反汇编通常这样做的运行时库代表您,了解它是如何完成的。

  • 由于 5. 绝对是家庭作业,类似于创建一个等效于给定 for() 循环的 C while() 循环,不要指望那里有太多帮助。指令集引用手册和使用(反)汇编器的实验是您在这里需要的。

    此外,如果您正在学习,请参加有关编译器如何工作/如何编写编译器的类(class)——它们确实涵盖了编译器如何完成汇编指令选择,我可以想象这是一个有趣/具有挑战性的术语项目,例如编写一个编译器,其输出保证包含字符“?”(0x3f)但绝不包含“!”(0x21)。你明白了。

    关于shell - 更多无空Shellcode,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6854156/

    10-11 07:08