首页
社区
课程
招聘
[原创]ShellCode学习1:最简单的ShellCode生成
发表于: 2021-6-3 21:39 12287

[原创]ShellCode学习1:最简单的ShellCode生成

2021-6-3 21:39
12287

ShellCode学习1

ShellCode初级版:

什么是ShellCode:

shellcode实际上是一段可以独立执行的代码,常指一段二进制数据,这段二进制数据独立存在,不像常规PE数据那样加载运行。它没有导入表导出表之类的结构,这使得shellcode极为灵活,同时也加大了它的编写难度。一段健壮的shellcode应具备很好的兼容性。因此,要编写出一个完整的ShellCode需要以下几个重要的技术要点:

1.GetPC(用于准确定位ShellCode所定义的数据):

在x86中即为获取当前代码执行的EIP(也就是程序执行到了哪一行代码)。

 

目前GetPC技术一共有以下几种:

CALL方式:

利用

1
2
E8 00000000 #CALL xxxx 
58          #POP EAX

的方式,进行获取当前EIP的值。在这里,CALL的作用等同于将下一条指令的地址压入栈后,在jmp到函数地址上。利用这个特性,我们可以结合pop将压入的地址进行弹出,从而获取到当前EIP。

 

但是虽然这种方法直观,简便,但是注意很多程序在读取你所编写的ShellCode时是自带00截断的,说的形象点,就像读取字符串的长度strlen一样,遇到00就会返回前面的字符串长度,后面的字符就不计数了。因此很有可能在读取Shell Code时会因为00截断导致后面的ShellCode无法正常加载并运行。

FSTEVV方式:

这个方式主要是因为:x86:当一个进程正在使用FPU(浮点单元)执行浮点运算时,这些寄存器需要有操作系统在上下文切换时保存。

 

重点关注这个结构体中的fpu_instruction_pointer:

1
2
3
4
5
6
7
8
9
10
11
12
13
struct FpuSaveState
{
    uint32 control_word;    // 控制码
    uint32 status_word;        // 状态码
    uint32 tag_word;        // 标志位
    uint32 fpu_instruction_pointer;        // *指向上条FPU指令*
    uint16 fpu_instruction_selector;   
    uint16 fpu_opcode;
    uint32 fpu_operand_pointer;
    uint16 fpu_operand_selector;
    uint16 reserved;
 
}

利用这个内容,我们可以得到上一条FPU指令所在的位置。大致情况如下:通过汇编指令FNSTENV(将FPU的状态值保存在内存中),在进行pop就可以得到当前EIP的值了:

1
2
3
D9 EE           #FLDZ  
D9 74 24 F4  #FNSTENV[ESP-0CH]
5B             #POP EBX

2.模拟导入表,获取函数地址

作为一段可以独立运行的代码,那必然没有线程的dll和函数可以提供给你直接调用。因此,在这里,我们就要用到Windows的强大设计:PEB(进程环境块),可能讲到这里,有些人不是对齐特别的了解,在这里我从网上扣了2张神图提供给大家方便学习:

 

img

 

img

 

img

 

大致代码原理如下:


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-6-3 21:48 被wx_墨雪妖莲编辑 ,原因:
收藏
免费 9
支持
分享
最新回复 (3)
雪    币: 2546
活跃值: (5822)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
谢谢分享!
2021-9-2 02:29
0
雪    币: 3433
活跃值: (4388)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢分享
2021-9-2 05:50
0
雪    币: 338
活跃值: (2006)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
谢谢分享
2021-9-3 11:43
0
游客
登录 | 注册 方可回帖
返回