海莲花OceanLotus样本分析
海莲花OceanLotus样本分析基本信息 APT32是一个至少从2014年开始活跃的威胁组织,别名海莲花(OceanLotus)。该组织针对多个私营企业、外国政府、持不同政见者和记者,重点关注越南、菲律宾、老挝和柬埔寨等东南亚国家。该组织是一个与越南政府利益一致的网络间谍组织。
FILENAME
FILESIZE
MD5
sample.exe
23487488 bytes
09D115A3B45694F8124CD8077D51A2EC
流程图
动态分析使用ProcMon进行抓包,样本释放名为A553.tmp的文件到环境变量TEMP目录,后经查看释放文件是样本母体拷贝到了TEMP目录
释放后执行释放的A553.tmp文件,释放体会将样本母体替换为同名的真实docx文档,并通过注册表查询word文档关联的默认打开程序,使用默认程序打开docx文档迷惑用户
详细分析样本入口点存在混淆代码,干扰分析与调试,排除无意义的跳转逻辑,剩下一个真实的条件跳转,根据判断条件,基本可以断定这个混淆会循环0xF5B2C次,在其地址后下断,直接跑即可到达核心代码 ...
Ursnif组织EXCEL4.0样本分析
Ursnif组织EXCEL4.0样本分析前言Ursnif是一种银行木马,是Gozi恶意软件的变体,主要与数据盗窃有关
基本信息 样本为EXCEL4.0宏样本。 VBA是在Excel 5.0版中引入的,Excel 4.0宏(XLM)功能是在1992年的Excel版本4.0中引入的。因此这些较旧的XLM宏也称为Excel 4宏。 要使用Excel 4.0宏,不需要任何编程。 可以像功能一样使用它们 。 如果将它们与已定义的名称结合使用,可以实现非常有用的功能。而不怀好意的人正是利用这点来编写恶意的EXCEL4.0宏代码。而且这种方式产生的效果也让人意想不到,因为部分杀软并未对宏4.0进行良好的监控。
FileName
MD5
FileSize
Abusech_ursnif.xls
0DD976DE7791A9839F9BC1EF3B9AD2E9
202240 bytes
流程图excel样本执行宏代码从远程服务器下载恶意程序并执行
详细分析使用olevba.py工具提取宏代码,存在大量隐藏sheet页面
1234567891011121314151 ...
SSDT_HOOK
SSDT_HOOKSSDT 原理其实很简单,首先通过API拿到ETRHEAD结构地址,通过结构成员拿到ServiceTable表,_KSERVICE_TABLE_DESCRIPTOR(ServiceTable)中第一项指向的内容就是SSDT _KSYSTEM_SERVICE_TABLE
12345678typedef struct _KSYSTEM_SERVICE_TABLE{ PULONG ServiceTableBase;//函数地址表首地址 PULONG ServiceCounterTableBase;//函数表中每个函数被调用次数 ULONG NumberOfService;//服务函数个数 ULONG ParamTableBse;//参数个数表首地址}KSYSTEM_SERVICE_TABLE,*PKSYSTEM_SERVICE_TABLE;
代码已开源:点击访问
windbg查看记录一下ETHREAD及EPROCESS结构体
ETHREAD(执行体线程块)结构内嵌了KT ...
IDA--pthon学习--函数变量去混淆
IDA–pthon学习–函数变量去混淆简介IDA python在2004年被开发出来,其目的是为了将python语言的简洁强大和IDA支持的IDC语言结合起来。
IDA python其实主要用到的如下三个模块:
1231. idc:这是兼容idc函数的模块 2. idautils:大多数处理都是需要依托于这个模块 3. idaapi:允许使用者通过类的形式,访问更多底层的数据
常用函数12345678910for func in idautils.Functions():#遍历函数idaapi.get_func(func_addr)#解析函数idc.GetMnem(start)#获取指令操作码idc.print_operand(start, 0)#可以理解为目的操作数idc.get_operand_value(start, 1)#可以理解为源操作数idc.get_item_size(start)#获取指令长度idc.GetFunctionName(func)#获取函数名称idc.GetDisasm(start)#获取反汇编idc.SegName()#获取数据段名称idc.GetO ...
VAD概念
VAD概念简介VAD其实没有过于复杂,由于本人总是忘记,遂写个记录方便以后查询.
内存分为物理内存和虚拟内存;操作系统和进程共享物理内存,进程独享虚拟内存;物理内存可以通过CR3寄存器在进程之间互相隔离,确保进程之间互不侵犯;2位下,每个进程独享4GB内存,怎么知道哪些内存已经使用过,windwos采用virtual address descripot自平衡二叉树来管理虚拟内存,低端的内存地址放在根节点左子树,高端内存地址放根节点右子树,大致的结构如下:每当进程调用virtualAlloc分配虚拟内存时,操作系统会先遍历这个树,看看还有哪些地方的虚拟内存还未使用
64位环境下查找VAD在EPROCESS结构中保存着VadRoot根节点
12345678910111213kd> dt _EPROCESSnt!_EPROCESS +0x000 Pcb : _KPROCESS +0x160 ProcessLock : _EX_PUSH_LOCK +0x168 CreateTime : _LARGE_INTEGER [...] ...
调试器基础0x2(调试器框架基础知识)
调试器基础0x2(调试器框架基础知识)创建/附加调试器首先需要实现的功能是能够附加到正在运行的进程或者创建一个被调试进程,当然,调试器必须与被调试进程具有交互的能力,这样调试器才能用来操作被调试进程。可以通过DebugActiveProcess函数并指定目标的进程标识符来实现的。或者,也可以通过调用CreateProcess来完成带有DEBUG_PROCESS或DEBUG_ONLY_THIS_PROCESS创建标志。后一种方法将创建一个新进程并将其附加到该进程,而不是附加到已在系统上运行的进程。附加后,调试器可以使用DebugSetProcessKillOnExit指定有关是否在分离时终止进程的策略。最后,分离过程是对DebugActiveProcessStop的直接调用。
调试循环调试器的核心组件是调试循环。 这是负责等待调试事件,处理所述事件,然后等待下一个事件(即循环)的部分。 在Windows平台上,这非常简单。 实际上,它非常简单,微软就此步骤需要完成的工作编写了一个简短的调试循环Demo页面。 大致步骤是(在一个循环中)调试器调用WaitForDebugEvent ,它等待 ...
调试器基础0x1(环境配置-代码思路)
调试器基础0x1(环境配置/代码思路)编译选项:配置属性->高级->字符集->使用多字节字符集
配置属性->C/C++->语言->符合模式->否
反汇编引擎:Capstone反汇编程序框架4.0.2版!2020年5月8日发布
用法参考 先知社区
代码思路:
创建/附加调试进程
调试循环
捕获异常消息
异常处理
交互
难点:
循环与处理
下断与修复
内存断点精准性
开源代码:https://github.com/yeanhoo/Debugger
调试器基础0x3(反汇编引擎使用)
调试器基础0x3(反汇编引擎使用)前言Capstone是一个轻量级的多平台,多体系结构的拆卸框架。
Capstone反汇编程序框架4.0.2版!2020年5月8日发布
多体系结构:Arm,Arm64(Armv8),BPF,以太坊虚拟机,M68K,M680X,Mips,MOS65XX,PowerPC,RISCV,Sparc,SystemZ,TMS320C64X,Web Assembly,XCore和X86(包括X86_64)(详细信息)。
干净/简单/轻巧/直观的中性API。
提供有关反汇编指令(其他人称为“分解器”)的详细信息。
提供反汇编指令的一些语义,例如读取和写入的隐式寄存器列表。
用纯C语言实现,具有D,Clojure,F#,Common Lisp,Visual Basic,PHP,PowerShell,Haskell,Perl,Python,Ruby,C#,NodeJS,Java,GO,C ++,OCaml,Lua,Rust,Delphi的绑定,免费提供Pascal和Vala。
Windows*和 nix的本机支持(已确认Mac OSX,iOS,Android, ...
Flare_On_7
Flare_On_7第七届年度Flare-On挑战赛
0x1
password验证逻辑,key=ghost
1234def password_check(input): altered_key = 'hiptu' key = ''.join([chr(ord(x) - 1) for x in altered_key]) return input == key
游戏逻辑,需要current_coins >target_amount - 2**20,修改代码逻辑,给current_coins赋值即可
12345678while not done: target_amount = (2**36) + (2**35) #current_coins = (2**36) + (2**35) +1 if current_coins > (target_amount - 2**20): while current_coins >= (target_amount + 2**20): ...
输入法注入
输入法注入系统在切换进程时会自动将输入法ime文件加载到进程内存,因此可以利用这一点实现自己的ime文件
不需要编写完整的输入法,只需要完成ImeInquire函数即可
输入法代码
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include<windows.h>#include<imm.h>#include<immdev.h>#pragma comment(lib,"imm32.lib")void MyFun();BOOL WINAPI DllMain(HMODULE hModule,DWORD reason_call,LPVOID lpReserved){ switch(reason_call) { case DLL_PROCESS_ATTACH: { WNDCLASSEXA wndClass = { 0 };//输入法必须注册窗口类 wndClass.lpfnW ...