Lazarus远控组件NukeSped分析

静态信息:

样本md5:9b656f5d7e679b94e7b91fc3c4f313e4
在这里插入图片描述

由此可见为假的Adobe Flash Player 的攻击样本

在这里插入图片描述
在这里插入图片描述

样本分析

在这里插入图片描述
通过五个函数,内部调用sub_40159D函数动态获取API函数
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
利用IDA python解密字符串。。

完整python代码

Python> idc.get_segm_name(here())
'.text'
Python> idc.GetDisasm(here())
'call    sub_405060'

Python>idc.print_insn_mnem(here())
'call'
Python>idc.print_operand(here(),0)
'sub_405060'
Python>idc.print_operand(here(),1)
''

idc.get_operand_value(ea,n)获取操作数的值。

在这里插入图片描述

完整python代码

from idaapi import *
import idc

    
from idaapi import *
import idc
def get_string(addr):
  out = ""
  while True:
    if Byte(addr) != 0:
      out += chr(Byte(addr))
    else:
      break
    addr += 1
  return out
  
def get_stringlen(addr):
    out = ""
    while True:
        if idc.get_wide_byte(addr)!= 0:
            out += chr(idc.get_wide_byte(addr))
        else:
            break
        addr += 1
    return addr
    

    
def get_function_argv(addr):
    for x in range(4):
        addr = idc.prev_head(addr)
        print("%08x" %addr)
       
        if idc.print_insn_mnem(addr) == "push" and "offset" in idc.print_operand(addr,0):
            print("GET success")
            print("%08x" %addr)
            return idc.get_operand_value(addr,0)
        else : 
            print("NO")
def get_retn(addr):
    for x in range(4):
        addr = idc.next_head(addr)
        if idc.print_insn_mnem(addr) == "mov":
            print("retn success")
            print("%08x" %addr)
            return idc.get_operand_value(addr,0)
        else :
            print("NO")
            
def Mydecrypt(stringstart,stringend):
    output = ""
    for i in range(stringstart,stringend):
        v3 = idc.get_wide_byte(i)
        print(v3)
        if idc.get_wide_byte(i)<97 or v3 > 122:
            continue
        if idc.get_wide_byte(i) < 101 or v3 >106:
            if idc.get_wide_byte(i)<116 or v3 >121:
                continue
            v4 = v3 - 15
        else :
            v4 = v3 +15
        
        ida_bytes.patch_byte(i,v4)
    for i in range(stringstart,stringend):
        output += chr(idc.get_wide_byte(i))
    return output
    
danger_funcs = ["getapi"] # 需要寻找的函数名
for func in danger_funcs:
    addr = get_name_ea_simple( func )

print("call sub_40159D:%08x" %addr)
cross_refs = CodeRefsTo( addr, 0 )
for addr in cross_refs:
    print("..................")
    print( "%08x" % addr)
    print("get_function_argv start")
    stringstart = get_function_argv(addr)
    print( "%08x" %stringstart)
    stringend = get_stringlen(stringstart)
    result = Mydecrypt(stringstart,stringend)
    print(result)
    idc.set_cmt(stringstart, result, 0)
   
    idc.set_name(stringstart, result, SN_FORCE)
    print("..................") 
    apiaddr = get_retn(addr)
    print("%08x" %apiaddr)
    idc.set_name(apiaddr, result, SN_FORCE)
     

   

已经被修改,伪代码没修改过来,N -> create name anyway,这样就方便静态分析了

在这里插入图片描述

在这里插入图片描述

调用GetModuleFileName获取当前的运行进程路径并将其写入到Run注册表中以实现本地持久化,写入的注册表键值为msnconf

在这里插入图片描述

继续跟到sub_402811函数:

再次调用五个函数动态获取API函数地址

sub_4021EE:

打开文件成功就读取文件到dword_40B498,buffer:0040AEB0,大小0x36Eu,打开文件失败则,memset对dword_40B498地址后0x36Eu大小 区域置零,

在这里插入图片描述

地址布局:

在这里插入图片描述

从unk_40B5A2开始,每0x10填充一个02

之后将IP和端口填充到前面用02分割的内存空间中,填充的02是connect参数sockaddr结构体中的sa_family。
在这里插入图片描述

int  main( )
 {
   printf("%d /n",htons(16));
      return 0;
}
得到的结果是4096
解释如下,数字16的16进制表示为0x0010,数字4096的16进制表示为0x1000。 由于Intel机器是小尾端,存储数字16时实际顺序为1000,存储4096时实际顺序为0010。因此在发送网络包时为了报文中数据为0010,需要经过htons进行字节转换。
数字所占位数小于或等于一个字节(8 bits)时,不要用htons转换

在这里插入图片描述

在这里插入图片描述

sub_402E9C:根据时间因子得到随机数,加上地址,可以从5个ip中随机获取一个,建立socket连接,成功连接尝试向C2发送测试数据(发送124345d,接收124343c,发送1243434),成功则将0x40B498地址处的内容发送到C2,服务器可根据该请求值判断当前攻击进行到哪一阶段,
若失败30次则休眠60秒后 重新生成随机数再次请求,若请求成功,尝试将0x40B498地址处的内容发送到C2:

在这里插入图片描述
传输数据函数:
在这里插入图片描述
两次send,第一次发送控制码,第二次发送数据。
经过加密后传输
在这里插入图片描述
接收数据的函数:第一次接收控制码,第二次接收指令数据。
在这里插入图片描述
对接受的数据解密
在这里插入图片描述

将服务器返回值写入nls文件中
在这里插入图片描述
之后while循环,根据发送0x1243454接收0x1243459判断状态。调用四次recv函数接收数据。第一次接收的数据根绝特征值执行不同操作,猜测是cmd命令。
在这里插入图片描述

向C2发送0x1243451,接收返回值传入Switch_case中

Switch_case:

在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值