OLLVM混淆
OLLVM混淆LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
个人感觉OLLVM混淆大都是while true的嵌套,而OLLVM的破解一般都用angr
虚假控制流 (Bogus control flow)在讲虚假控制流之前,我们看看别的,利用不透明谓词混淆代码的原理是什么?
不透明谓词是指一个表达式,他的值在执行到某处时,对程序员而言必然是已知的,但是由于某种原因,编译器或者说静态分析器无法推断出这个值,只能在运行时确定。
不透明谓词的设计必须满足俩条件
1,对于混淆器也就是开发者,它的值在执行到某阶段总是确定的。
2,对于分析器,也就是攻击者,只有执行到某阶段才能确切的知道它的值。
条件一和条件二完美符合,那么这个不透明谓词就算是一个高质量的设计。
原理其实挺简单,但是要设计出简单高效高质量的不透明谓词,是比较难的。
在将代码转换成汇编和机器码之前,编译器 ...
python逆向总结
python逆向使用python2加载python3生成的*.pyc文件也会导致此错误。但似乎有例外
但通常会报出有魔数错误(bad-magic-number-error)以下为Stack Overflow的一篇
魔数错误
re羊城杯 2020 login
pyinstaller编译的exe文件
使用python3
pyinstaller flag.py
在script文件夹里,会生成flag.exe_extracted,在文件夹里找到login
提出index文件加上文件头:
420D0D0A000000000DA91B60A8090000
反汇编 Python 字节码基本反编译函数 dis() 打印 Python 代码源(模块、类、方法、函数或代码对象)的反汇编形式。 可以通过从命令行运行 dis 来反汇编诸如 dis_simple.py 之类的模块。
# cat demo.pyi = 1s = "Python"d = {}l = []# python…………>>> source = open("demo.py ...
LLVM入门
LLVM入门LLVM是模块化、可重用的编译器以及工具链的集合,有些人把LLVM当成是一个低层的虚拟机(low level virtual machine),但官方给出的解释是这样的:
The name “LLVM” itself is not an acronym; it is the full name of the project.
也就是说LLVM并不是一个缩写,而是整个项目的全名。LLVM和传统的编译器(GCC)是有差别的
传统的编译器架构
传统的编译器架构主要分为三个部分
Frontend:前端包括词法分析、语法分析、语义分析、中间代码生成
Optimizer:优化器主要是对编译前端对生成的中间代码的优化
Backend:后端翻译中间代码为native机器码
LLVM编译器架构
LLVM编译器套件与传统编译器架构的不同之处主要在于
LLVM编译器的前端其它层(优化器、后端)是分离的,LLVM专门有一个Clang子项目用来对源码进行编译,生成IR(intermediate representation)中间字节码;而传统编译器的代表(GCC)由于编译前后端耦合度太高, ...
Re学习目录
Re学习目录有点乱,之后做一下整理
常见加密工具
IDA:FindCrypt IDA 7.0版本安装查询加密算法的findcrypt3脚本插件的详细步骤
PEID:KANAL(Krypto ANALyzer) (PEiD自带)
各类加密解析:逆向中常见的Hash算法和对称加密算法的分析
特征值识别注意特征值可能会改变
TEA | AES | DES | BlowFish | MD5 | SHA1 | CRC32 | Base64
特征算法识别RC4 | Base64 | TEA | AES | DES | MD5
第三方库识别
字符串报错
函数签名识别
Load File -> Flirter file
Diff二进制对比识别
逆向常见方法符号执行
python虚拟机:python的库之间会起冲突,比如angr会修改z3,那么需要一个python的虚拟环境
z3:一个泛型约束求解的东西
angr:强大的模拟执行工具,有些z3不能解的这个可以解
去平坦化(OLLVM):编译原理相关,可以试试用脚本还原 (利用符号执行去除控制流平坦化)
Pin插桩貌似国赛都没考过,但是可以 ...
空想的diary_1024
diary整理一下,做个记录
2021-12-7整理一下博客,每天一题CTF。快考试了,争取不挂科555。还有四级。
2021-12-12写了好多,一天改博客啥也没干
2021-12-24昨天看了一篇文章,五味成杂
2022-1-15打了一天游戏,惊了,ppp,你怎么能自甘堕落
虚拟机保护逆向
VM逆向软件防逆向工程与逆向工程相伴发展,早期的有花指令,反调试技术,代码混淆与加密,加压缩壳或者加密壳等等保护手段,这些技目前已经有了较好的解决方案,自动化的分析方法也比较成熟。目前比较前沿的软件保护技术是虚拟机保护(Virtual-Machine-Protect),当然这种虚拟化的思想也广泛用于软件开发等其他领域。
现在CTF比赛中的虚拟机保护也越来越多,再不学简单题也做不出来了。
基本原理这里的虚拟机指的是一种解释执行系统或者模拟器(Emulator)。所以虚拟机保护技术,是将程序可执行代码转化为自定义的中间操作码(OperationCode,如果操作码是一个字节,一般可以称为Bytecode),用以保护源程序不被逆向和篡改。opcode通过emulator解释执行,实现程序原来的功能。在这种情况下,如果要逆向程序,就需要对整个emulator结构进行逆向,理解程序功能,还需要结合opcode进行分析,整个程序逆向工程将会十分繁琐。这是一个一般虚拟机结构:
做题方法在比赛中,虚拟机题目常常有两种考法:
· 给可执行程序和opcode,逆向emulator,结合opcode文件 ...
Windows系统编程
Windows内核常见的函数后缀eg:MessageBox
A ASCII
W UNICODE
Ex 改进
32位调用的是stdcall,64位调用的是fastcall存在eax中
0环的helloworldNT驱动
WDM
WDF
UWDF
内核数据结构在Windows能中有一种很重要的数据结构管理机制,这就是内核对象。应用层的线程,进程,文件,驱动模块,事件,信号量等都有对应的对象。
一个Windows的内核对象分为 对象头和对象体两部分,在对象头中至少有1个OBJECT_HEADER和对象额外信息。对象题紧接着对象头的OBJECT_HEADER。一个对象指针总是指着对象题。如果要访问对象头,需要将对象体指针减去一个特定的偏移值,以获取OBJECT_HEADER,通过OBJECT_HEADER 结构定位从而为访问其他对象结构的辅助信息,对象内部一般会有1个type和1个size成员,用于表示对象的类型和大小。
Windows对象类型主要有以下3种,
1、Dispatcher对象
2、IO对象
3、其他对象
base大家族
base大家族与逆向分析base在逆向中也算常见的加密了
算法分析下面讲解base64和32和16
base64以下内容为wiki解释
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2^6=64,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后BinHex的版本使用不同的64字符集来代表6个二进制数字,但是不被称为Base64。
Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。
编码规则
第一步,将每三个字节作为一组,一共是24个二进制位第二步,将这24个二进制位分为四组,每个组有6个二进制位第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节第四步,根据下表,得到扩展后的每个字节的对应符号,这就 ...
RC4
RC4与逆向分析RC4算法于1987年由Ron Rivest设计,RC4现在以及成为最流行的流密码算法,广泛应用于SSL,WEP中。
加密过程和解密过程相同,使用同一个密钥就可以在密文和明文之间转化
c=RC4(key,m)m=RC4(key,c)
RC4(Rivest Cipher 4)是一种流加密算法。流加密,是对称加密算法的一种,加密和解密双方使用相同伪随机加密数据流(pseudo-randomstream)作为密钥,明文数据每次与密钥数据流顺次对应加密,得到密文数据流。实践中数据通常是一个位(bit)并用异或(xor)操作加密。
RC4密钥长度可变。RC4是有线等效加密(WEP)中采用的加密算法,也曾经是TLS可采用的算法之一。
所谓对称加密是指:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
简而言之,假设我们的明文数据是N位,那么得到的密文数据也是N位,由于是xor操作,我们就可以再xor一下将密文还原成明文。
RC4算法主要有两大部分组成:初始化算法(KSA)和伪随机子密码生成算法(PRGA)
加密(解 ...
程序的机器级表示
程序的机器级表示GCCC 语言编译器以汇编代码的形式产生输出,汇编代码是机器代码的文本表示,给出程序中的每一条指令。然后GCC 调用汇编器和链接器,根据汇编代码生成可执行的机器代码。
我们为什么要学习汇编语言?
阅读汇编有助于我们理解编译器的优化能力,分析代码中隐含的低效率
不同线程是如何保持数据私有或共享数据
程序被攻击的许多方式涉及程序存储运行时的控制信息的方式的细节,许多攻击利用了系统程序中的漏洞重写信息,获取系统的控制权
我们需要了解编译器在将c语言转化为机器代码时转化,优化编译器能重新排列执行顺序,,消除不必要的计算,用快速操作替代慢速操作.这是一种逆向工程(Reverse Engineering)
基于x86-64,关注GCC和Linux使用的特性
程序计数器:PC、x86-64用%rip表示,给出将要执行的下一条指令在内存中的指令