Reverse 训练计划
给战队小孩锻炼逆向能力,每次会出一个专题练习。
Task 动态调试
了解如何使用ida进行动态调试
https://adworld.xctf.org.cn/challenges/details?hash=84657b0c-e01c-4426-b1a1-a5d1d630146b_2&task_category_id=4
https://adworld.xctf.org.cn/challenges/details?hash=bbfa61dd-8934-4c0d-be63-9b7acb7f8d16_2
目标:通过动态调试,修改程序或者让程序暂停在某个状态,从而获取flag
限制:使用IDA进行动态调试
upx壳
目标:了解upx脱壳方法,了解通过修改节表名和oep脱壳两种方式的高级脱壳方法
https://wwi.lanzoup.com/i8ElI0gjx9oh
这周学习python逆向,基础内容的话先自己去找些入门文章看看然后再来做目标:了解python逆向方法,文件头修改方法,pyz加密解密,z3solver使用
hint:https://www.zrzz.site/pos ...
CTF-Reverse-IDA添加结构体
手动创建
shift F9调出窗口
右键insert一个
在ends处按d键,或者右键添加数组,还能对字段改名,从而插入结构体
类C语法创建结构体
shift + F1调出窗口,右键插入,使用语法插入即可。例如
1234struct student { char name[16]; int age;}
CTF-Reverse-pyc加密破解
这个在一次讲课的过程中去做了,但是忘记总结了,这里再写写
首先在pyinstaller打包的时候,是可以通过–key选项进行加密的。会将import的部分打包成pyz文件。
这里的加密会对main程序中import的部分进行加密,而main程序是不会加密的。
所以一般出题可以这样出。
12from test_main import mainmain()
这样的话选手就不得不对pyz进行破解了。
例如我们这里来一个example
1pyinstaller --key 123 -F test.py
随便写个test.py程序,然后打包
打包可能会有一段时间,不过没关系
我们使用pyinstxtractor进行解包
可以看到有提示,虽然成功解包,但是还存在无法被解密的部分
破解过程
没关系,一步步解密。因为在运行时还是需要解密的,所以解密过程就在pyimod02_archieve.pyc中,这个我们可以直接用uncompyle恢复。
我们将这个内容定向到archieve.py中。并且在尾部添加这些代码
1234567891011path = ''inf = open ...
CTF-Pwn-ret2dlresolve
本文来源:
http://pwn4.fun/2016/11/09/Return-to-dl-resolve/
题目文件:
链接: https://pan.baidu.com/s/1fjE9DsUoixNSfDz_OcKRmg?pwd=inp0 提取码: inp0
最近在学pwn额,学到ret2_dl_resolve这卡了很久,博客里面其实利用过程说的很好了,但是在利用的各个stage上,会有一些理解问题,这里我把我的理解写出来,也希望能帮助到更多的人来学习这个知识点。
下面我用的pwn环境是基于welpwn的,改一下代码也可以用pwntools
前几个stage内,我们的目标都是打印出/bin/sh字符串,在最后我们直接将write改为system即可getshell
Stage1
这里我们直接返回到write@plt,很简单。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697 ...
OS-rust写操作系统
指导书地址https://rcore-os.cn/rCore-Tutorial-Book-v3/
第零章-环境配置
首先试了试了他提供的虚拟机进行操作,但是由于rust代码更新较快,虚拟机已经是1年多之前的了,也不好使,不如重新弄个ubuntu 20安装。
过程就按照他给的一步步安装环境就行,比较简单,最后clone下来仓库在main或者2022spring分支跑下测试就可以。
第一章-应用程序与基本执行环境
简单来说是介绍了操作系统的启动流程:
cpu初始化,加载bootloader代码、数据
bootloader初始化,加载操作系统代码、数据
进入操作系统
同时介绍了如何在qemu里编写内核指令,并且调整内存布局,使得内核对接到qemu下。
此外也简单介绍了链接脚本的语法。
例如linker.ld文件
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748OUTPUT_ARCH(riscv)ENTRY(_start)BASE_ADDRESS = 0x8020 ...
羊城杯2022-Reverse-WP
easyjs
挺恶心的题目
首先反编译elf,发现quickjs字眼。
quickjs反编译字节码
这个还好没太恶心,就是quickjs最新版本
clone到linux后make && make install
随便写一个js然后进行编译qjsc -e -o hello.c hello.js
这里可以直接在quickjs目录里进行,比较方便,得到hello.c
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768/* File generated automatically by the QuickJS compiler. */#include "quickjs-libc.h"const uint32_t qjsc_hello_size = 177;const uint8_t qjsc_hello[177] = { 0x02, 0x07, 0 ...
CTF-Reverse-自动化去花指令
灵感来源:http://schnappi.games/2022/04/09/手脱花指令及ida脚本编写/
在中难题中,出题者往往通过ollvm、花指令、vm等手段妨碍正常逆向分析过程,本篇将介绍使用自动化脚本进行去花。
简单例子
这是一个简单的tea加密
12345678910111213141516171819202122#include <stdio.h>#include <stdint.h>void encrypt(uint32_t* v, uint32_t* k) { uint32_t v0 = v[0], v1 = v[1], sum = 0, i; /* set up */ uint32_t delta = 0x9e3779b9; /* a key schedule constant */ uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3]; /* cache key */ for (i = 0; i ...
滑动窗口应用
简单记录下滑动窗口的应用场景。
计算窗口内最大/最小值
核心思想是使用deque即双向队列。如1696. 跳跃游戏 VI,核心思想是dp的延伸,但是使用到滑动窗口维护前k个数内的最大值,那么我们使用一个deque,从前往后降序排列,取的时候从前面取出。
123456for (int i = 1; i < n;i++) { while (q.size() && i-q.front()>k) q.pop_front(); // 每次从前面pop不在范围内的 f[i] = f[q.front()] + nums[i]; // 肯定是最大值所以直接计算跳到i位置的最大值 while (q.size() && f[i] > f[q.back()])q.pop_back(); // 比i小的值肯定没用了,去除同时保证队内的顺序 q.push_back(i);}
Constraint-guided Directed Greybox Fuzzing复现
首先从约束生成入手,研究如何从git的patch log中生成约束。
先从论文中给出的算法入手,输入是改变位置的集合。
首先对每个位置遍历,并根据规则区分它们
新的条件、包含异常抛出
条件互斥
变量被替换
其他
接下来对CnTars进行判断,TSs为target site集合,DCs为 data condition集合。
如果C1Tars不空,如果C1Tars的post都相同,那么TSs设置为C1Tars.pre的位置,DCs设置为post的条件。
如果C2Tars不空,且C2Tars.pre都相同,C2Tars.post也相同,则TSs设置为C2Tars.pre的位置,C为C2Tars的条件,DCs为C的pre条件和post条件的互斥。
如果C3Tars不空,并且C3Tars的变量改变处都相同,则TSs设置为C3Tars.pre的位置,V为C3Tars的改编后的变量,DCs设置为V.pre与V.post的不相等。
剩下就是TSs为C4Tars,DCs为空,即nT模板。
最后将TSs通过哨兵函数连接起来。
同时把target site的形式规定为 文件名:行号:列号
Constraint-guided Directed Greybox Fuzzing阅读
Constraint-guided Directed Greybox Fuzzing
难点
有导向的黑盒测试没有考虑有序的目标点和数据条件。本文提出的有约束条件导向的测试方法,将约束定义为目标点和数据条件的组合。并且驱动种子按照顺序满足有顺序的约束。
解决方法
提出新的约束距离来判断seed的优劣,约束距离需要考虑到两个方面,一是有顺序的目标点,二是数据约束,同时提出自动化产生约束的方法。
背景
DGF技术在重现崩溃时非常有用,但是耗时较长,主要是两个方面:1、DGF假设目标点是相互独立无序的,2、DGF没有考虑崩溃所需的数据条件。
介绍
CDGF要求种子满足一连串的约束条件,为了衡量种子对约束的满足程度,CDGF将种子距离定义为约束条件的距离,而不是传统的DGF中到目标点的距离。同时提出了从crash dumps和补丁日志自动生成约束的算法。
在DGF中,每个代码块被赋值为到所有目标点最短路径的调和平均数,种子的距离被定义为代码块的平均值。通常来讲,种子能覆盖更多的目标点,种子距离越小。
这里说是调和平均数,但是通过计算公式,调和平均数应该是倒数相加除以数量再取倒数,但是找了原文:D ...