Stager Payload原理分析

先说一下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文件

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的开发都使用此算法

最后更新于