【问题标题】:More Null Free Shellcode更多无空 Shellcode
【发布时间】:2011-07-28 04:39:14
【问题描述】:

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

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

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

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

mov    eax,0x5a

谢谢!

【问题讨论】:

  • 听起来,呃,很可疑——这是干什么用的?
  • mov ebx, str 用于打开 /dev/zero 以便我可以将内存初始化为 0。
  • mov eax, 0x90 正在为 linux 系统调用设置操作码
  • 我认为这个问题更像是“你打算做什么?”。寻求 shellcode 建议的人往往没有好结果。而且很多人都不想要其中的任何一部分。
  • 第一个是,由于您提供的约束(字符串位于 .data 部分中),在您尝试创建的代码类型中实际上是不可能的 - 独立且完全独立于位置。这意味着您对特定数据/代码位置一无所知。要解决这个问题,请发挥创造力……不要坚持将字符串放在 .data 中。

标签: shell assembly shellcode


【解决方案1】:

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

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

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

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

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

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

由于 5. 绝对是家庭作业,就像 创建一个与给定 while() 循环等效的 C for() 循环,不要期望有太多帮助。指令集参考手册和(反)汇编程序的实验是您需要的。

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

【讨论】:

    【解决方案2】:

    您通过xor 提到恒定负载以清除加上incshl 以获取您想要的任何位集。

    我能想到的加载未知常量(你的未知 str)的最不脆弱的方法是加载常量 xor0xAAAAAAAA 之类的值,然后 xor 在后续指令中退出.例如加载0x1234:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      相关资源
      最近更新 更多