Shell 更多无空外壳代码

Shell 更多无空外壳代码,shell,assembly,shellcode,Shell,Assembly,Shellcode,我需要找到以下指令的无空替换,以便将以下代码放入外壳代码中 我需要转换为无空的第一条指令是: mov ebx, str ; the string containing /dev/zero 字符串str在my.data部分中定义。 二是: mov eax,0x5a 谢谢 您通过xor提到恒定负载,以清除plusinc和shl以获得所需的任何一组位 我能想到的加载未知常量(您的未知str)的最简单的方法是加载带有0xaaaaaa等值的常量xor,然后在后续指令中返回。例如加载0x12

我需要找到以下指令的无空替换,以便将以下代码放入外壳代码中

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

mov ebx, str    ; the string containing /dev/zero
字符串str在my.data部分中定义。 二是:

mov    eax,0x5a

谢谢

您通过
xor
提到恒定负载,以清除plus
inc
shl
以获得所需的任何一组位

我能想到的加载未知常量(您的未知
str
)的最简单的方法是加载带有
0xaaaaaa
等值的常量
xor
,然后在后续指令中返回。例如加载
0x1234

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

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

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

  • 拿起英特尔的指令集参考手册(我想在撰写本文时有四卷)。它们包含操作码表(指令二进制格式)和特定程序集助记符(指令名)的所有允许操作码的详细列表。
    让自己熟悉它们,并在心里将它们分为两组-那些符合您期望的属性(例如,不包含“x”字符…或任何其他特定字符)的组,和那些不包含的组。如果存在第二类代码,则需要从代码中删除它们

  • 编译代码,告诉编译器不要放弃编译中间体:gcc-save temps-c csource.c

  • gcc -save-temps -c csource.c
  • 反汇编对象文件:objdump-dcsource.o
  • objdump -d csource.o
  • objdump
    的反汇编输出将包含二进制指令(操作码)以及指令名(助记符),即,您将确切地看到选择了哪种操作码格式。现在,您可以根据1检查其中是否有第二组操作码。上面

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

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

  • 从5号开始。当然是家庭作业,类似于创建一个C
    for()
    循环,相当于一个给定的
    while()
    循环,不要期望有太多帮助。这里需要的是指令集参考手册和(dis)汇编程序实验


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

    听起来,呃,可疑-这是干什么用的?mov ebx,str用于打开/dev/zero,这样我就可以将内存初始化为0s。mov eax,0x90正在为linux系统CALL设置操作码。我想问题更像是“你打算做什么?”。寻求外壳代码建议的人往往没有什么好处。而且很多人不想参与其中。第一个是,根据您给出的约束条件(字符串位于
    .data
    部分),在您试图创建的代码类型中不太可能-自包含且完全独立于位置。这意味着您无法了解特定数据/代码位置。要解决此问题,请发挥创意…不要坚持字符串位于
    。data