BeginCTF 2024冬
BeginCTF 2024冬写的题不多,从师傅们写的特别好的wp们学到了很多, 以下是学习复现后的一些笔记 参考了很多师傅的文章: 官方wp 直接写了很多不会的题的题解 这哥们思路图非常好,借鉴 除密码的全能师傅 RE题目附件 real checkin xor这道题是,因为签到逆向题有点难,出题师傅又出的真真签到题,确实不难。 直接给的就是代码 12345678910111213def verify_func(ciper,key): encrypted = [] for i in range(len(ciper)): encrypted.append(ord(ciper[i])^ord(key[i%len(key)])) return encryptedsecret = [7, 31, 56, 25, 23, 15, 91, 21, 49, 15, 33, 88, 26, 48, 60, 58, 4, 86, 36, 64, 23, 54, 63, 0, 54, 22, 6, 55, 59, 38, 108, 39, 45, 23, 102, 27, 1 ...
迷宫及数独问题
迷宫及数独问题 迷宫问题 迷宫类题目,出题人会在程序中构造一个迷宫。该迷宫一般由各种符号构成,一些符号表示墙壁,一些 符号表示可以行走的路,并标定入口和出口。 程序依据解题者输入的字符串来走迷宫(如有的题目以 w/s/a/d 字符分别表示 向上/向下/向左/向右 行 走一格),如果该字符串满足以最短路径从入口走到出口,并且中间没有任何碰壁行为,则获得 flag。 迷宫问题有以下特点: 在内存中布置一张 “地图”(通常是一个字符串) 将用户输入限制在少数几个字符范围内 一般只有一个迷宫入口和一个迷宫出口 布置的地图可以由可显字符 (比如 # 和 * ) 组合而成 (这非常明显, 查看字符串基本就知道这是个迷宫题 了),也可以单纯用不可显的十六进制值进行表示。可以将地图直接组成一条非常长的字符串,或是一行 一行分开布置。如果是一行一行分开布置的话,因为迷宫一般都会比较大,所以用于按行(注意, 布置并 非按顺序布置, 每行都对应一个具体的行号, 你需要确定行号才能还原迷宫地图) 布置迷宫的函数会明显 重复多次。 而被限制的字符通常 ...
Python逆向
Python逆向pyc文件创建及使用pyc 文件是 python 在编译 *.py 文件过程中出现的主要中间过程文件,是一种二进制文件,是一种bytecode。pyc 文件是可以由 python 虚拟机直接执行的程序。因此分析 pyc 文件的文件结构对于实现 pyc 反编译就显得十分重要。另外,pyc** 的内容,是跟 python 的版本相关的,不同版本编译后的pyc 文件是不同的,3.8 编译的 pyc 文件,3.7 版本的 python 是无法执行的。 先写个 test.py: 123a = 123def add(v1, v2): return v1 + v2 我们可以通过 py_compile 模块来生成 pyc 文件: 12from py_compile import *compile("test.py") 或者直接通过命令行 python -m test.py 生成 pyc。 两种操作都会在当前目录下新建一个 pycache 目录,其中存放着 test.cpython-版本号.pyc 。 如果有一个现成的 pyc 文件,要如何导入它呢? 123456 ...
IDAPython常用函数
IDAPython常用函数官方文档 基础API here() / get_screen_ea():返回光标当前所在地址 get_inf_attr(INF_MIN_EA) / get_inf_attr(INF_MAX_EA):获得最小 / 最大地址 generate_disasm_line(ea, GENDSM_FORCE_CODE):获得 ea 所在处的一条汇编指令 print_insn_mnem(ea):获得 ea 所在处的指令助记符 print_operand(ea, n):获取 ea 所在处的第 n 个操作数 段 Segments():返回段的可遍历对象 get_segm_name(ea):获得 ea 所在段名 get_next_seg(ea):获取下一个段 get_segm_start(ea) / get_segm_end(ea):获取段开始 / 结束地址 for seg in Segments(): 1print(f"{get_segm_name(seg)}, {get_segm_s ...
HGAME& BeginCTF 202401
HGAME 20240129MISC签到日常关注微信号–flag SignIn侧着看着图片w(经典 simple——attack明文爆破zip 来自星尘的问候六位弱加密 希儿希儿希尔希尔加密,但是图片怎么修复? REezIDA打开IDA就是 ezUPXUPX脱壳,看伪代码, flag xor 0x32 后为一个数组 写入010editor,转换一下就出来了 (一定要抄对((别抄,直接shift e导出(( ezASM根据汇编: 12345678910111213141516171819202122232425262728293031323334353637383940414243data: c = [74, 69, 67, 79, 71, 89, 99, 113, 111, 125, 107, 81, 125, 107, 79, 82, 18, 80, 86, 22, 76, 86, 125, 22, 125, 112, 71, 84, 17, 80, 81, 17, 95, 34] flag = [0, 0, ..., 0] # 33 elements initiali ...
OLLVM
OLLVMLLVM 是一个开源的编译器架构,利用虚拟技术对源代码提供现代化的、与目标无关的、针对多种 CPU的,代码优化和代码生成功能。 LLVM 核心库提供了与编译器相关的支持,可以作为多种语言编译器的后台来使用,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。 LLVM 三段式架构: 前端:解析源代码,由语法分析器和语义分析协同工作,检查语法错误,并构建语言的抽象语法树来表示输入代码, 然后将分析好的代码转化为 LLVM 的中间表示 IR (IntermediateRepresentation) 。 优化器:通过一系列的 Pass 对中间代码 IR 进行优化, 改善代码的运行时间使代码更高效。 后端:负责将优化器优化后的中间代码 IR 转换为目标机器的代码 OLLVM(Obfuscator-LLVM) 是瑞士西部应用科学大学安全小组于 2010 年 6 月发起的一个项目。该项目的目的是提供一套开源的基于****LLVM的代码混淆工具,通过代码混淆和防篡改提供更高的软件安全 性。 OLLVM 工作在 LLVM IR 中间表示层,通过编写Pass来混淆*** ...
指令虚拟化
指令虚拟化虚拟机(VM)其实就是用软件来模拟硬件。我们可以仿照 x86 指令集,自己定义一套指令,在程序(解释器)中有一套函数和结构来解析自定义的指令并执行相应的功能。 虚拟化是一种基于虚拟机的代码保护技术。他将硬件支持的机器码转化为字节码指令系统,来达到不被轻易篡改和逆向的目的。 简单来说就是出题人通过实现一个小型的虚拟机,自定义一些操作码(opcode),然后在程序执行时通过解释操作码,执行对应的函数,从而实现程序原有的功能。 下图是常见的虚拟机结构: 虚拟机的主程序其实就是一个循环,这个循环不断的去读取指令(伪机器码 opcode),然后执行指令opcode 所对应的一些函数,这样下来就可以与真实的程序执行相差无几。 正向实现想要对抗虚拟化,首先要搞清楚用于保护的虚拟机是如何实现的要想实现虚拟机,需要完成两个目标: 定义一套指令集 实现对应的解释器 结构体定义真实赛题中的 VM 通常会实现一个类似如下的结构体,用于保存虚拟机状态: 12345678typedef struct{ unsigned int r1; // 虚拟寄存器 r1 unsigned int ...
自修改代码
PE文件结构// 自修改代码Self-Modifying Code 自修改代码(Self-Modifying Code),指在一段代码执行前对它进行修改。把代码以加密的形式保存在可执行文件中(或静态资源中),然后在程序执行的时候进行动态解密。这样我们在采用静态分析时,看到的都是加密的内容,从而减缓甚至阻止静态分析。 原理与示例SMC思路: 1234567if (运行条件满足) {DecryptProc(Address of Check) // 对 Check 代码解密// ........Check(); // 调用 Check// ........EncryptProc(Address of Check) // 再对代码进行加密,防止程序被 dump} SMC静态分析对抗示例: 正常程序: 12345678910#include <stdio.h>int check(int in) { return in == 12345;}int main() { int input; scanf("%d ...
花指令&反调试
花指令&反调试2024/01/17 好,做道upx练手,把sublime搞崩了。后来才知道是文件没有保存用不了。现在还有个问题,就是文件git不上去。。。听天由命吧 2024/01/18 git上去了! 方法:更改了C:\Windows\System32\drivers\etc的hosts,加了IP表,好用!(呜呜呜) 2024/01/19 听伯尼学长说,修改系统配置的http_proxy和https_proxy为梯子的ip,这样就可以在ping的时候走梯子了 或者直接在cmd里set http_proxy=http://127.0.0.1:7890 & set https_proxy=http://127.0.0.1:7890 欸嘿,昨天玩儿了一天,今天继续学 花指令解析失败,一般可能是花指令 会被执行干扰静态分析* 改变堆栈操作123456789#include <stdio.h>int main(){_asm {push eax;add esp, 4;}print ...
常用命令/快捷方式
常用命令/快捷方式IDA:静态调试交叉引用:X 地址跳转:G 书写注释:/(伪代码) ;(反编译窗口) 修改符号名:N 数据类型操作:Y 修改数据长度:D 函数操作: 定义函数:P 删除函数:Delete/U 修改函数范围:Ctrl+E(函数窗口) Alt+P(反汇编) 代码与数据转换: U取消已有数据 D变成数据 C变成指令 A以该位置为起点定义一个以\0结尾的字符串类型 O将此处定义为一个地址偏移 创建数组:* 创建结构体:Shift+f1–local types–insert 提取数据:shift+E 函数调用图:View–Graphs–Function calls 常数搜索:Alt+I Patch:Edit -> Patch program -> Change byte 要永久 Patch, Edit -> Patch program -> Apply patches to input file 动态调试选择 Debugger -> Select debugger,选择合适的调试器: 如果是 exe,可以 ...