返回介绍

Stager Payload 原理分析

发布于 2024-06-01 22:17:40 字数 2506 浏览 0 评论 0 收藏 0

先说一下stager也就是那个远程加载Beacon.dll的shellcode,具体你可以转到resources\httpstager.bin里查看,然后比对msf的stager_reverse_http.asm你会发现基本这两个shellcode基本没啥区别,这主要是因为cs借鉴和使用msf项目相关的代码

我这里以http(s) stager为例其他几种的stager基本上大同小异

msf http(s) stager

先来整体看一下msf的stager

可以看出msf http stager基本上就两大块

一个经典的call pop将api_call函数地址存到ebp中(block_api.asm这一整个文件是api_call函数)

api_call怎么实现的具体可以去看block_api.asm里的代码,我这里就简单说一下它的作用,api_call接收一个API的哈希值,然后在链表中搜索解析,并获取函数的地址,最后调用函数(所以除了要传入API的哈希值还要压入API的参数值)


代码就不全截图了

block_reverse_http.asm文件


load_wininet前面的宏定义是用来分别https和http

msf的就说到这里吧,这个基本上就是调用api_call通过它调用Win API使用http接收反射dll然后loader没太多可说的

CS http(s) stager

首先先用cs生成一个stager格式选择raw,然后反汇编

从这里应该可以看出cs的stager和msf的非常相似基本一样

在加载完wininet.dll后就可以正式搜索并调用wininet.dll里的函数

基本上都是这个套路没啥好说的

push API参数1 push API参数2 push .... push API哈希值 call ebp(api_call) ;搜索并调用函数

整体上cs stager和msf stager都是一样的,都是通过WinInet系列函数远程加载stage并使用VirtualAlloc为其分配一块可写可读可执行的内存,最后转去执行stage

但是如果你真的有细心去看msf和cs的stager你应该会发现一个奇怪的地方,cs比msf多调用了几个函数

InternetErrorDlg 0xBE057B7
GetDesktopWindow 0x315E2145
GetLastError 0x5DE2C5AA

杂谈

1.我这里插一句题外话,msf或cs的stager如果想要对它做混淆(我这里指的混淆,不是利用xor not或AES等方式对shellcode加密,而是指利用花指令,流程混淆,代码膨胀,指令替换等等方式的代码混淆)就必须得要考虑混杂在指令之中的数据,因为在msf或cs里都是使用call pop,这种方式来使用数据传参,这会导致反汇编引擎在解析的时候极有可能直接把数据解析成代码,导致误操作数据(向原本的数据中插入指令导致数据被修改)

如图本来这里原来的意图是call一个地址然后把ip的地址压入到栈中,随后pop到寄存器当作参数使用但是,如果这里被解析成代码,在混淆时被插入了垃圾指令,就会导致原本的ip被修改从而在运行时会出错,所以在做shellcod指令混淆时要注意这点

2.关于这个hash算法你可以自行谷歌GetProcAddressWithHash,这个是c代码,基本上许多shellcode的开发都使用此算法

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文