vnctf2023 - 复现
复现期间去郑州玩了一趟,先复现一下数据安全的 re 题,当时在线下做了nm 90%最后发现密钥都写脸上了就是没出😅😅😅
Butterfly安卓逆向,先看 AndroidManifest.xml 找 MainActivity
check 函数是 static 方法,明显要逆 so ,解压以后 ida 打开,是个 arm 架构的。
字符串窗口可以搜到 check 字符,查查交叉引用,用 JNIEnv * 修复一些函数以后,发现注册了一个 native 方法
sub_1FD80 就是我们要找的 check 函数,点进去翻翻找到了 yyyyyy 这个函数,显然是被混淆了,但是没有关系,直接选中汇编创建函数然后反编译即可
同时发现相邻的函数
非常可疑,点进去一眼 AES,cipher 就是 yyyyyy 里的 v6,密钥和 iv 都是 1234567890123456
cyberchef 一把梭 flag{welc0me_backTo_obfuscation}
PZGalaxy直接 view - source 一下就能找到源码,一看是个 RC4 加密
123 ...
HGAME 2023 week3 & week4 writeup
patchmemain 函数里有个 gets,同时翻了翻发现有一段代码,里面有个 mprotect 下面是对一个大数据段的异或操作,显然是个 SMC,一个比较 pwn 的方法是利用 get 的漏洞改汇编然后跑出 flag,也可以直接逆。
由于只是一个简单异或,考虑用 idapython 直接实现 smc 的解密
12345from idc_bc695 import *addr = 0x14C6for i in range(961): PatchByte(addr, Byte(addr) ^ (0x66) & 0xFF) addr += 1
解密完的数据 analyze 以后得到关键代码
123456789101112131415161718192021#include <bits/stdc++.h>#include <stdint.h>using namespace std;long long v9[6], v13[6];int main(){ v9[0] = 0x5416D999808A28FALL; v9[1] = ...
西湖论剑初赛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 ...