《Mastering Malware Analysis》第三章
Mastering Malware Analysis Chapter 3
PE部分之前学PE文件结构一直忽视了这个Rich头
通过Rich字符定位这个结构,Rich后紧跟的是一个校验和,他后面紧跟着的是XOR key,可以用它来解密Rich头的内容,一旦解密,就会包含编译这个程序的软件 的 各种各样的信息。
使用PE头信息用于静态分析PE文件得到什么信息取决于需要回答什么问题。
怎样使用PE头来进行事件处理Is this malware packed?看节表的内容(比如UPX0等)或者导入表的数据(通常加了壳的会含有极少的API)
Is this malware a dropper or a downloader?用Resource Hacker看资源表的数据,观察导入表中的函数,比如URLDownloadToFile或者ShellExecuteA等API
Does it connect to the Command & Control server(s) (C&C, or the attacker’s website)? And how?还是看AP ...
《Mastering Malware Analysis》第一章
Mastering Malware Analysis Chapter 1
只记录想记录的,一些熟练的就不记录了~ ~ ~CTI:Cyber Threat Intelligence
IoCs: Indicator of Compromise
IoAs: Indicators of Attack
NDRs: Network Detection Responses
为什么分析恶意软件恶意软件分析在事件响应中攻击发生—>取证—>发现malware–>分析
发现所有的IoCs
理解Payload的能力
解密和理解在malware和attacker之间的网络流量
为了达到大的覆盖范围,基于Windows的恶意软件仍然是最盛行的(因为它常用),再就是Android, IoT
探索恶意软件类型恶意软件种类恶意软件的种类通常由他的影响或传播方法定义。下面是常用的例子
Trojan: 最常见的恶意软件种类,在用户不知情的环境中执行恶意活动,得名于传说中征服特洛伊城的特洛伊木马。
Downloader:下载执行外部的payload
Dropper: 在这里额外的payload ...
《Invoke-Deobfuscation:AST-Based and Semantics-PreservingDeobfuscation for PowerShell Scripts》论文阅读
2. Invoke-Deobfuscation:AST-Based and Semantics-PreservingDeobfuscation for PowerShell Scripts这篇文章讲了基于AST的,变量追踪的,保留语义的一个去混淆工具,是开源的
https://gitee.com/snowroll/invoke-deobfuscation?_from=gitee_search
介绍主要工作利用AST的可恢复节点来精确的识别模糊片段,通过Invoke函数和变量跟踪来模拟恢复过程
现存方法去混淆主要分为3步
识别混淆片段
去掉混淆
重建脚本
识别混淆PSEDM, PSDecode, PowerDrive, and PowerDecode 设计了一系列正则表达式去匹配混淆的片段,这些基于正则表达式的方法忽略了脚本的语法信息
Li et al.(也就是轻量级的那个论文作者) 设计了一个基于机器学习的分类器去识别模糊的脚本片段,这非常依赖训练的数据
去掉混淆
预定义的恢复规则
[PSDecode, PowerDrive, Powerdecode] 这种方法仅仅对 ...
《Effective and Light-Weight Deobfuscation and Semantic-Aware Attack Detection for PowerShell Scripts》论文阅读
1. Effective and Light-Weight Deobfuscation and Semantic-Aware Attack Detection for PowerShell Scripts代码在 https://github.com/li-zhenyuan/Effective-and-Light-Weight-Deobfuscation-and-Semantic-Aware-Attack-Detection-for-PowerShell-Scripts
主要工作
先基于子树去混淆(利用了机器学习识别混淆的子树)
利用OOA提取了恶意代码的语义规则然后进行检测
POWERSHELL DEOBFUSCATION
处理混淆大体分为5个阶段
把脚本文件解析为AST树(在解析的时候,对变量两端进行链接,在下面的第2步,第3步也这样操作)
用分类器识别混淆的子树(用到了机器学习, 混淆的子树并不都是可恢复的)
利用仿真器恢复混淆的片段
把第三步解混淆后的片段再弄成AST子树,替换进去
(1-4步循环,直到找不到混淆的子树)利用Post Processing模块把找不到 ...
2022* CTF部分RE题目WP
2022* CTF部分RE题目WPSimple File SystemIDA打开程序进行分析
instruction.txt的内容为
123456789101112# instructionsI implemented a very simple file system and buried my flag in it.The image file are initiated as follows: ./simplefs image.flag 500 simplefs> format simplefs> mount simplefs> plantflag simplefs> exitAnd you cold run "help" to explore other commands.
程序逻辑是创建一个磁盘,格式化并挂载,然后将flag文件的内容加密后存储进去,只需要找到对应的加密函数写解密脚本即可
IDA找到plantflag处的代码
这里的sub_216A函数的功能其实就是create_inode,v21,v22是2个随机数,而s ...
第10章_栈溢出与ROP
栈溢出原理由于C语言对数组引用不做任何边界检查,从而导致缓冲区溢出成为一种很常见的漏洞。由于栈上保存着局部变量和一些状态信息(寄存器值、返回地址等),一旦发生严重的溢出,攻击者可以通过覆盖返回地址来执行任意代码,利用方法包括shellcode注入、retlibc,rop等
危险函数大多数缓冲区溢出问题都是错误地使用了一些危险函数所导致的。
scanf, gets这类
strcpy, strcat, sprintf这一类
返回导向编程ROP是Return-Oriented Programming 的缩写,因为引入了NX机制,数据所在的内存页被标记为不可执行,此时在执行shellcode就会抛出异常,因为注入新代码不可行,所以就利用程序中已有的代码。
使用ROP攻击,首先需要扫描文件,提取出可用的gadget片段(通常以ret指令结尾),然后将这些gadget进行组合,来达到攻击者的目的。举个例子,exit(0)的shellcode由下面4条连续的指令组成。
12345; exit(0) shellcodexor eax, eaxxor ebx, ebxinc eaxint 0x80
...
2022miniLctf_RE出题_twin
目录文件
RE.exe 最终的题目文件
resexe .bak 这是进程2的PE文件,将其加密后存放在了RE.exe的资源段
链接:https://pan.baidu.com/s/1gEOMjqnrdsdoZUPE0rAknw提取码:r5qi
出题思路及考察知识点出题思路出了一道多进程的题目,进程1在TLS_CALLBACK0(Reason为DLL_PROCESS_ATTACH) 的时候输入FLAG,如果没有调试,就动态添加TLS_CALLBACK1
这时候EIP来到了 TLS_CALLBACK1(Reason为DLL_PROCESS_ATTACH ), 在其中HOOK掉WriteFile函数,然后ExitProcess()
EIP来到了 TLS_CALLBACK0(Reason为DLL_PROCESS_DETACH) , 将进程2释放出来并启动,在进程2中对flag的前半段进行验证,进程1通过进程2的ExitCode来验证flag的前半段是否正确,如果正确则验证flag 的后半段。
进程1采用的算法就是普通的XXTEA,而进程2采用的是魔改XXTEA(因为如果 ...
攻防世界PWN刷题1
攻防世界PWN刷题11. dice_gameXCTF 4th-QCTF-2018
IDA打开程序分析,发现是一个随机数的小游戏
在这个地方存在溢出,可以把seed给覆盖掉,把seed覆盖为0,然后自己写个程序看随机数
123456789101112131415#include <stdio.h>#include <stdlib.h>int main(){ srand(0); for(int i =0; i < 50; i ++) { int tmp = rand() % 6 + 1; printf("%d, ", tmp); } return 0;}
然后写EXP即可
12345678910111213141516171819from pwn import *context.log_level = "debug"# io = process("dice_game")io = remote ...
第9章_格式化字符串
基本原理格式化字符串漏洞如今在桌面端已经比较少见了,但在物联网设备上依然层出不穷。
原理通过一个例子来说明
1234567#include <stdio.h>int main(){ printf("%s %d %s %x %x %x %3$s", "Hello World!", 233, "test"); return 0;}
1gcc -g -m32 -z execstack -no-pie -fno-stack-protector main.c
gdb 调试起来,在printf函数那下断点,观察参数
此时栈上的参数为这些(绿色),但是%s %d %s %x %x %x %3$s ( %$3s 是打印可变参数中的第3个,以字符串的形式打印), 但是由于格式化要求的参数和实际提供的参数不一致,所以它会继续从栈上取参数,即红色的部分,这样就造成了数据的泄露
所以,格式化字符串漏洞发生的条件就是 格式字符串要求的参数和实际提供的参数不匹配
漏洞利用对于格式化字符串漏洞的利用 ...
第8章_整数安全
如果一个整数用来计算一些敏感数值,如缓冲区大小或数值索引等,就会存在潜在的危险,通常情况下,整数溢出并没有改写额外的内存,不会导致任意代码执行,但是它会导致栈溢出和堆溢出,而后两者会导致任意代码执行。
整数溢出异常情况主要是3种
溢出,只有有符号数才会发生溢出,溢出标志OF可检测有符号数的溢出
1234int i; i = INT_MAX; //2147483647i++;printf("i=%d\n", i); // -2147483648
回绕,无符号数会发生回绕,溢出标志CF可检测无符号数的溢出
1234unsigned int ui;ui = UINT_MAX; //在x86-32上,为4294967295ui++;printf("ui=%d\n", ui); //ui=0
截断,将较大宽度的数存入一个宽度小的操作数中,高位发生截断
1234567891011121314#include <stdio.h>int main(){ unsigned int a = 0xfffffff ...