首页
社区
课程
招聘
[已解决] [求助]向大佬求助,shellcode一执行,目标进程(一个无保护的自己写的进程)就崩溃,是什么原因? 100雪币
发表于: 2024-8-28 13:59 1907

[已解决] [求助]向大佬求助,shellcode一执行,目标进程(一个无保护的自己写的进程)就崩溃,是什么原因? 100雪币

2024-8-28 13:59
1907

下面是代码(部分为伪代码)

//shellcode
ULONG_PTR WINAPI MemoryLoadLibrary_Begin(INJECTPARAM* InjectParam) {
printf("InjectParam->dwDataLength:%d\r\n", InjectParam->dwDataLength);
return 0;
}

//用于辅助计算shellcode长度
void MemoryLoadLibrary_End()
{printf("MemoryLoadLibrary_End\r\n");
}

//执行这个函数向目标进程注入shellcode
void InjectDll::RemoteMapLoadDll(HANDLE TargetProcess)
{
SIZE_T dwWrited = 0;
//初始化参数结构体
INJECTPARAM InjectParam;
RtlZeroMemory(&InjectParam, sizeof(InjectParam));

//shellcode长度
DWORD ShellCodeSize = (ULONG_PTR)MemoryLoadLibrary_End - (ULONG_PTR)MemoryLoadLibrary_Begin;

//拷贝ShellCode代码
PVOID pShellCodeBuffer = malloc(ShellCodeSize);
RtlCopyMemory(pShellCodeBuffer, MemoryLoadLibrary_Begin, ShellCodeSize);

//结构体参数赋值
InjectParam.dwDataLength = 0x1000;

////申请内存,把Shellcode和参数复制到目标进程
////安全起见,大小多加0x100
PBYTE pStartAddress = (PBYTE)VirtualAllocEx(TargetProcess, 0, ShellCodeSize +0x100+ sizeof(InjectParam), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
//结构体参数赋值
InjectParam.lpFileData = pStartAddress;

//写入ShellCode
PBYTE ShellCodeAddress = pStartAddress;
WriteProcessMemory(TargetProcess,ShellCodeAddress,pShellCodeBuffer, ShellCodeSize, &dwWrited);

//写入参数
PBYTE ShellCodeParamAddress = pStartAddress + 0x100 + ShellCodeSize;
WriteProcessMemory(TargetProcess, ShellCodeParamAddress, &InjectParam, sizeof(InjectParam), &dwWrited);

HANDLE hRemoteThread = CreateRemoteThread(TargetProcess, 0, 0, (LPTHREAD_START_ROUTINE)ShellCodeAddress, ShellCodeParamAddress, 0, 0);

//关闭资源...
}


[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 7248
活跃值: (5078)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
首先你要生成shellcode,需要把项目的 安全检查 设置禁用
其次,如果是64位的,下面这个字符串他汇编寻址应该是Lea AAA,[BBB]
printf("InjectParam->dwDataLength:%d\r\n", InjectParam->dwDataLength);
你直接copy到其他内存区域导致地址指向错误的内存地址,所以崩溃

检查shellcode错误,真的不懂哪里错误的时候,还是用CE附加上去,自己写shellcode进去后,知道code位置下断点,然后再运行,简单明了

要是汇编都还看不明白的话,先去学一下汇编指令
2024-8-29 02:00
1
雪    币: 3575
活跃值: (3268)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
写代码 调试才是主要的
2024-8-29 07:47
1
雪    币: 1073
活跃值: (602)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
关闭GS,字符串要是位置无关的,可以先其一个进程加载shellcode调试,看在哪个指令崩的,等本进程能够成功加载,在注入到目标进程一般就没问题。
2024-8-29 16:51
0
雪    币: 109
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
游乐娃子 首先你要生成shellcode,需要把项目的 安全检查 设置禁用 其次,如果是64位的,下面这个字符串他汇编寻址应该是Lea AAA,[BBB] printf("InjectParam- ...
正解,那天已解决,回答非常详细,非常感谢
2024-9-4 16:49
0
雪    币: 109
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
感谢各位回答,问题原因:项目 安全检查 设置禁用 并 为 release版本。printf是我随便加的,这种系统调用不能直接这样写。
2024-9-4 16:54
0
游客
登录 | 注册 方可回帖
返回
//