更多Null Free Shellcode

时间:2011-07-28 04:39:14

标签: shell assembly shellcode

我需要为以下指令找到无空位替换,以便将以下代码放在shellcode中。

我需要转换为null-free的第一条指令是:

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

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

mov    eax,0x5a

谢谢!

2 个答案:

答案 0 :(得分:4)

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

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

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

    gcc -save-temps -c csource.c

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

  5. 这项工作的广告位现在就出现了。如果您在反汇编输出中发现不符合您的期望/要求的指令,请查找/创建替代(或更常见的是,几个指令的替代序列)给出相同的最终结果,但仅由 匹配您需要的指令组成 回到上面的编译中间体,找到csource.s程序集,进行更改,重新组装/重新链接,测试。

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

  7. 由于5.肯定是家庭作业,与创建一个等同于给定for()循环的C while()循环相同,不要指望那里有太多帮助。您需要的是指令集参考手册和(dis)汇编程序的实验。

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

答案 1 :(得分:1)

您通过xor提及常量加载以清除加号incshl以获取您想要的任何位数。

我能想到的加载未知常量(您的未知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!