西湖论剑初赛2023 - re复现
坐牢一天,Dual personality 一眼看出远跳转改了 CS 寄存器把程序变成了 64bit-mod 但是后面的加密逻辑静态看完全看不懂,后面又觉得 babyRE 能做,看出 base8 以后被一个 SHA-1 校验卡了一个小时,最后爆破少了后面的六位没爆出来,大失败属于是😓
babyREida 打开发现 main 函数啥也没有,一看到 TlsCallback 函数就明白了应该是个回调函数 + 异常处理的题,交叉引用找到了三个注册函数
一个一个点进去,发现这三个函数里面有六个子函数,在每个函数开始的地方下断点,一路 F9,就能找到加密函数的执行顺序。
首先可以看出输入为 0 - 9 的数字。
然后是对 408104 进行一个取反,直接调过去就行。
然后 hook 了GetLastError 函数,注册了 base8 加密,没什么用。
然后来到了 base8 加密,表就是之前的 byte_408104, 值得注意的是,这里在加密以后,是从第 16 位开始与密文进行比对的,比较长度为 96 位,前面16位是由 input 的前6位生成的,在这里没有进行比对。
再按一次 ...
unicorn模拟执行初探
从放寒假摆到现在,哈哈,再不学 re 👶要被开咯,本来想写写安洵杯的题的,结果从 pyc 开始后面全几把粪题,出题人自己都没玩明白,果断放弃(笑嘻了),RCTF 据说有个 unicorn ,之前大爹也说过 unicorn 模拟执行这个玩意儿,感觉很高级,找了一篇还能看的懂的年前起个头学一下。
什么是unicorn一些官方翻译Unicorn是一个轻量级,多平台,多架构的CPU模拟器框架,基于qemu开发,它可以代替CPU模拟代码的执行,就比如说我们需要调试某个程序,常见的调试器需要配置可执行文件需要的环境并且还需要考虑一些恶意代码导致的安全问题,但是通过unicorn我们就可以单纯的模拟代码的执行(甚至可以指定从某个地址开始执行)而不需要考虑这些问题。
它的亮点(这也归功于Unicorn是基于qemu而开发的)有:
支持多种架构: Arm, Arm64 (Armv8), M68K, Mips, Sparc, & X86 (include X86_64).
对Windows和nix系统(已确认包含Mac OSX, Linux, BSD & Solaris)的原生支持
具 ...
记一次TEC-8仿真软件patch
计组实验的仿真软件,每次打开只能做半小时,然后自动关闭(真傻逼,而且我还做不明白),看看能不能把时间给调一下。
打开软件之前发现同目录下还有licens.txt和Timekey.txt
虽然我也搞不明白完整版到底有哪些功能,但是感觉和这个自动关闭应该是有关系的,那就先搜搜这俩文件名看看有什么线索。
最后在调用TimeKeys.txt的函数中发现了一个关键的地方:
同时还发现了mainform,
经过调试,在该函数中会让软件的GUI逐渐显现出来,那么显然内置时间的操作应该就在这附近了,因为处理一个问题的函数往往会写在一起,我们随便翻一翻function界面。
运气比较好,往下点几个就能找到控制时间的函数了,再次通过交叉引用
发现有个TimerColseTimer,大概就是这个了,点进去看一看
发现有出现数字 1800 和 MainForm,哈哈,那就开始patch吧,直接在汇编窗口把1800都修改为3600
大功告成,Apply 一下重新打开.exe文件
倒计时变成60分钟了,且通过测试,确实是在60分钟以后才自动关闭的。
然而该做的实验还是得做。。。破解了不会做实验 ...
《whoami》——一部“社工观众”的电影
信息安全心理学大作业,哈哈爽看电影写影评,本来是剪了六个片段的,但是emmm不会传视频,文章的颜色标记也没了,可能阅读体验不会很好,凑合看吧(感觉大家都在看啊,可以讨论讨论呢)
《whoami》,又名《我是谁:没有绝对安全的系统》,是我很早之前就看过的一部电影,当时看时,总觉似懂非懂,不理解电影中人物的行为和动机。而本学期,在听了辛阳讲师的《信息安全心理学》课程,涉猎了杨义先教授所著的《黑客心理学》一书以后,我突然间对这部电影有了全新的理解,甚至生发出了一种想法:也许我,以及许多观众,都被这部电影的编剧和导演给“社工”了——或许作为观众的我也只是看见了我想看到的而已。
一部展现“社会工程学”的电影,为什么会让我有一种“被社工”的感受呢?下面让我们从电影本身的剧情开始,以一个“观众”,一个“受害者”的视角,结合我所学习到的“社会工程学”的一些原理,从分支剧情——主线剧情——电影本身三个阶段来剖析这部电影的“社工手段”,当然也包括电影剧情本身的“漏洞”。
在阅读之前,需要先声明本文的几个标记颜色(颜色估计没得看了,凑合凑合吧)。
1、 漏洞(男主人公故意暴露的叙事漏洞)
2、 ...
最近遇到的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了?
...