最近遇到的VM题
DDCTF2018 - 黑盒测试(先放一道老题)源码分析解包后得到两个文件,一个elf,另一个txt文件,名字是flag-48ee204317,源代码:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081__int64 __fastcall main(int a1, char **a2, char **a3){ __int64 v4; // rbx int i; // [rsp+Ch] [rbp-84h] FILE *stream; // [rsp+10h] [rbp-80h] char s[8]; // [rsp+20h] [rbp-70h] BYREF int v8; // [rsp+28h] [rbp-68h] __int16 v9; // [rsp+2Ch] [rbp-64h] char v10; // ...
LLVM——从入门到入土
感觉新生赛的 reverse 要被橄榄了,于是哥几个合计合计说要加个 OLLVM 混淆,感觉学不完了(悲
简介提到 LLVM,可能会有一些陌生,但是如果说到另一个编译框架,那可能是个写代码的应该都见过,那就是 GCC , GCC的编译分为3个模块:前端,优化器和后端。
而 LLVM 其实和 GCC 差不多,也是分为3个模块
此外,我们一般用来编写 C/C++/OC 语言一般会用到 Clang/LLVM 框架,Clang 的作用是把源文件生成中间代码 IR ,然后经由 LLVM 生成后端。
单从编译原理上来说,GCC 和 LLVM 好像感觉差不多,但是 LLVM 作为一个新型的编译器框架,其相比于 GCC 的优势还是非常明显的。
模块化LLVM 是高度模块化设计的,每一个模块都可以从 LLVM 项目中抽离出来单独使用,也就是说如果想开发一门新的语言,那么只需要把前端模块抽离出来进行修改;如果想应用一个新的平台,那么只需要把后端模块抽离出来进行修改,这相比于三个模块耦合在一起的GCC框架来说无疑是更加方便的。
可拓展LLVM 为开发者提供了丰富的 API ,例如开发者可以通过 L ...
OLLVM——好像挖了个填不上的坑
控制流平坦化——Flattening Control Flow过程如图,即将正常控制流中基本块之间的跳转关系删除,用一个集中的分发块来调度基本块的执行顺序。
具体代码实现原理
在写具体的控制流平坦化的代码实现之前,我们需要进行一些宏定义来让我们写起来更加方便
123456789101112131415161718#ifndef _UTILS_H_#define _UTILS_H_#include "llvm/IR/Function.h"#define INIT_CONTEXT(F) CONTEXT = &F.getContext()#define TYPE_I32 Type::getInt32Ty(*CONTEXT)#define CONST_I32(V) ConstantInt::get(TYPE_I32, V, false)#define CONST(T, V) ConstantInt::get(T, V)extern llvm::LLVMContext *CONTEXT;namespace llvm{ void fixStack ...
强网拟态2022初赛 - 复现
纯纯摸鱼,然后靠队友带飞,都太强了😭😭😭一定好好当端茶倒水小弟
S3qUenCEs1234567891011121314You are given an array a consisting n(1=<n<=10^6) integers a1,a2,...,an(-10^9<=ai<=10^9 for each 1<=i<=n) and an integer k(1<=k<=n).You can do any number of operations.In each option you can choose an interval [l,r] with a length of k and multiply the number al,al+1,...ar in array a by -1.You have to output the maximum value of the sum of the array a after any number of options.You need to answer 100 independe ...
TSCTF-J 2022 Reverse (Official?) Write Up
baby_xor0x01 预期解十分简单的签到题,逻辑就是简单异或加密。解出来的人数也十分对得上人口普查器的描述。
有一个小坑点:enflag[25]的值是 0 ,如果直接从 ida 上静态复制的话会发现 flag 少了一位,在 flag 的提交记录中可以发现有的师傅踩了这个坑而且十分遗憾地没有更正。
12345a = [18, 20, 7, 17, 4, 110, 10, 58, 25, 124, 32, 14, 122, 6, 123, 22, 100, 8, 6, 48, 4, 22, 34, 117, 27, 0, 36, 18, 40, 4, 105, 42, 57, 67, 43, 85, 13, 60, 5, 83, 19]for i in range(41): a[i] = i ^ a[i] ^ 0x46 print(chr(a[i]), end = "")
baby_upx第一个版本的附件是 vs 编译版本的,这个版本的附件在脱壳后的代码逻辑十分易懂,但有很多师傅反映没有装 vs ,缺少 dll 无法运行,并且不想让 vs 强暴自己的 ...
angr初探
一些碎碎念本来是想学z3的,后来发现都要用 virtualenvwrapper ,既然都是符号执行,那就先试试angr的水吧。
本来是挺好配置环境的,但是之前那个ubuntu有问题怎么都配不上,无奈重装了一个虚拟机,捏妈,装了一晚上,加上下载中文包,啥也没干,被迫摆烂一天重新开始学。
不过令我高兴的是,新装的ubuntu可以支持和原系统共享剪贴板,好好好,终于可以永久告别啥指令都要建个文档用文件互相传的日子喽。
angr介绍angr 是一个基于符号执行和模拟执行的二进制框架,可以用在很多的场景,比如逆向分析,漏洞挖掘等。
符号执行
假如我们遇到一道逆向分析题,正常的流程应该是:拖入IDApro一键F5反编译然后硬刚代码写exp得到flag使得该程序输入该flag可以输出“success”等提示字样。(bushi
假如有一堆if语句,分别是if(a>b),if(b>c)……(等等,这不是差分约束么)
于是如果我有一个东西,可以自动分析这些语句的逻辑构造一个输入可以让程序跑到指定的一条语句,比如printf(“Oooooooops”);那么是不是就可以自动获取flag了?
...
idapro快捷键
看詹爹的出题文档发现有一堆快捷键不会,找了一会,从官网发现一个比较全的快捷键表 ,只不过都是英文的,尝试翻译一下并一个一个实现。
用?表示未实现,用*个数表示主观重要程度,越多越重要(吧大概)🤔
文件操作* Parse C header file…(分析C头文件):Ctrl + F9? Create ASM file…(生成ASM文件):Alt + F10* Save(保存):Ctrl + W* Exit with Save (退出并保存): Alt + X 或 Alt + F4导航** Jump to operand (跳转到操作数):Enter? Jump in a new window (跳入新窗口):Alt + Enter*** Jump to previous position( 跳转到上一个位置):Esc** Jump to next position (跳到下一个位置):Ctrl + Enter这个操作就相当于是 Esc 的逆操作,好像之前不太常用
** Jump to address…(跳转到地址):G
这win11的圆角真tm傻逼。。。
** Jump by na ...
PE文件格式学习笔记
感觉只学手操不学基础知识还是不行,趁着暑假赶紧补一补, 跟着这篇学的 。
从一次PE编辑实现弹窗开始堆理论知识之前先搞一波实操:在一个exe程序启动之前实现一个弹窗功能。
添加区段这里就用线程的LordPE来实现吧,我们先拷贝一份_LordPE_fix - 副本,打开后显示出这样的界面
这便是该程序的启动界面,我们要做的就是在这个界面之前添加一个弹窗。
我们用LordPE打开之前拷贝的副本(没错,我改我自己),显示的便是拷贝文件的一些基本信息
重点关注以下信息:
区段数目
NumberOfSections
0004
入口点
EntryPoint
0x00004340
镜像基址
ImageBase
0x00040000
镜像大小
SizeOfImages
0x00036000
点击区段,显示出区段表,正好有4项
名称后面分别是:
VOffset
VSize
ROffset
Rsize
Flags
映射入内存后的虚拟地址
映射入内存后的虚拟地址长度
文件中的位置
文件中的长度
区段属性
右击最下面的区段后点击添加区段,发现多了 ...
DSCTF-2022-Ffunction
占个坑比赛的时候硬刚的catchme,逆完SO找JNI_LOADER之后除了一堆sub函数和一个b64表啥也看不出来,然后直接润了。听大爹说直接findcrypt就能找到AES加密算法,打算做完Ffuction回来再做这个。
Ffunction解压后发现是一个exe文件和几个dll文件,由导入表知识可知,dll文件存的是一些API,在可执行文件运行到某处的时候会发生一次jmp跳转进而运行导入表中的内容,所以我们对exe文件启用动调,在Output输出框中尝试找到关键的dll文件是哪一个。
可执行文件可以直接试出flag长度为30位,我们按死F8,等程序跑飞时,输入30位测试输入,输出框跳出了load my_plugin.dll,说明关键代码在my_plugin.dll里面。
我们用打开my_plugin.dll,看到有一个叫f的函数,考虑到这个题目名字就是Ffunction,应该是关键函数,点进去看,大概分为两部分,先看第二部分。
12345678910111213141516171819202122232425262728bool __fastcall f(_BYTE *a1, c ...
TSCTF2022-reverse-赛题复现
happy mota先玩游戏,玩两局发现魔王很难打,通过npc对话发现flag被分成四段,并且玩到第11层的时候对话中有提示:11-19层的墙壁有点奇怪,发现第一串flag是TSCTF{enj。
有了玩游戏的基础,发现flag都隐藏在NPC对话中,用pyinstxtractor.py反编译main.exe得到main.py,但是main函数中的字符串经过decode后发现都是操作相关,并不涉及于NPC的对话,于是先扒文件,在\happy_mota\main\scripts目录下找到人物对话源代码,发现三段可疑代码:
12345s = b''f2 = self.parameter['2wsxdr5']for i in range(len(f2)): s += bytes([f2[i] ^ i ^ 0xC8])self.conversation_control.print_word("商人L3m0nade", "爽快!我这儿捡了个字符串:\"" + s.decode() + '\& ...