本篇文章用于记录思路和步骤(为了考虑兼容性,我们使用的是x86,x64的PEB结构位置会有一些不同)
免责声明
文章所涉及内容,仅供安全研究教学使用,由于传播、利用本文所提供的信息而造成的任何直接或间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任
前言:
首先shellcode为了要保证在任何地方都能跑起来,那么就要做到不依靠外部函数,整个代码功能全由自己实现,例如数据传输全部依靠寄存器,函数不靠编译器提供的函数调用等等。
思路:
我们通过自实现函数功能,来获取需要的模块和函数地址。首先我们需要获取PEB里面的Ldr地址(Ldr中储存了当前进程载入了哪些dll以及dll的名字和地址),再从Ldr中获取我们需要的dll地址。获取到我们需要的dll地址以后,通过我们自实现的函数获取到user32.dll的地址(在这里值得注意的是,Ldr记录的dll中,没有我们需要dll(我们需要的是user32.dll),所以我们需要通过Krenrl32.dll),最后获取到loadlibray和getprocaddress函数的地址,通过这两个函数以及我们需要的dll地址,我们就可以获取所有我们需要的函数(例如:Messagebox)。
操作细节:
我们需要修改vs的配置,操作如下:
1.将编译器修改为Release版本
2.取消代码优化,将运行库修改为MT或者MTd模式
3.取消SDL检查,禁用安全检查
4.将程序入口点改为我们设置的函数同时关闭名称粉碎
在这里我们需要导入PEB头文件,PEB.h里面存放了PEB的结构和Ldr的结构。最后我们将代码生成为.exe文件,使用x32dbg打开,将.text的数据拷贝为.bin文件并用winhex打开,将其复制出来,就是我们要的shellcode了。
实例图片:
成功生成.exe文件,接下来就是取出功能代码
通过x32dbg打开我们生成的.exe文件取出其中的可执行代码部分内存
然后我们再生成一个通过参数加载shellcode的.exe文件
通过这种方式运行就可以达到效果了(这里我们写的是使用messagebox去弹窗)
运行效果
关注公众号输入文章名获取代码和PEB.H
原文始发于微信公众号(泾弦安全):shellcode编写与简单运行
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论