可信执行环境TEE(rwctf)
@TOC只有一个re题,属于查文档现学现卖的类型,我发现国外题都喜欢这么考,不像平常做的硬在文件里搞个加密算法,当然这种题的难度还是很大的,比如这次在前期做题的时候就出现目标不明确的情况,不知道要干什么,ida都派不上用场,到后来hint出来的时候,才开始去搞tee,虽然说前面也关注到这个了,但方向还是走错了,浪费了大部分的时间
TEE背景随着移动设备的发展,移动设备的功能越来越强大,移动设备会存储用户的资产,处理支付等操作。目前移动端的系统运行环境叫做REE(Rich Execution Environment),在其中运行的系统叫做Rich OS(Operating System),包含Android、IOS和Linux,Rich OS的特点是功能强大,开放和扩展性好,可以给上层应用提供设备的所有功能,比如摄像头,触摸屏等,这样才有了我们现在看到的各种各样的应用。但Rich OS存在很多的安全隐患,比如经常会发现bug,OS可以获得应用所有的数据,很难验证OS是否被篡改,这些对于用户资产有很大的安全隐患,那如何解决这些问题呢?这时候就需要TEE帮忙了。TEE的全称trusted e ...
异常处理
@TOC阅读加密解密的异常处理章节,总结。
异常处理的基本概念当有程序发生异常的时候,CPU通过IDT(中断描述符)来寻找处理函数。IDT是存在于物理内存的线性表,32位下每项长8字节,64位下每项长64字节IDTR是用来描述IDT位置和长度的寄存器,一共48位,高32位是表的基质,低16位是表的长度。可以通过SIDT和LIDT指令来读取该寄存器,LIDT只能在ring0下运行发生异常的时候,通过类型号执行相应的函数(kiTrapxx),同时还会将异常处理信息进行封装,包括两部分:异常记录和陷阱帧
异常记录execeptioncode定义了异常产生的原因
陷阱帧描述了异常时线程的状态,记录了每个寄存器的情况此结构只在内核时使用,用户使用时会把陷阱帧复制一份命名为context来使用
处理过程封装好后,会调用nt!KiDispatchException来继续处理异常在内核状态下和用户状态下有着不同的处理过程,在有调试器或者没有调试器也有着不同的处理过程
内核下产生异常&&没有调试器:1调用nt!DispatchException,根据seh来处理异常2处理不了的话,调用K ...
寒假打卡
@TOC寒假打卡地
Easy Crack拼接flag得Ea5yR3versing
Easy Unpackod单步调试 可以找到oep
Easy Keygen异或
123456789101112#include<stdio.h>int data[100]={0x5B,0x13,0x49,0x77,0x13,0x5E,0x7D,0x13};int key[10]={0x10,0x20,0x30};int main(){ for(int i=0;i<8;i++){ data[i]^=key[i%3]; printf("%c",data[i]); } return 0;}
Easy ELF简单异或0x78^0x340x310x7C^0x320xDD^0x880x58
CSHOPc#程序有乱码先去混淆修改按钮大小
HateIntel4轮大循环,每次做特定操作,每位直接没有联系,可以爆破
1234567891011121314151617181920212223242 ...
反调试
@TOC核心原理的最后一章是反调试,闲的无聊,在宿舍又读了一遍反调试,做了个总结。
静态反调试PEBPEB被广泛运用于反调试手段这里一共有四个标志
12340x2 BeingDebugged0xc Ldr0x1b ProcessHeap0x68 NtGlobaFlag
首先说第一个BeingDebugged这个标志对应的api就是我们最常见的IsDebuggerPresent,当其值为1的时候代表程序被调试,破解方法就是在内存中把1修改为0即可。
第二个Ldr标志,这个只适用于xp操作系统PEB.Ldr指向PEB_LDR_DATA结构体,这个结构体实在堆内存创建的,而在调试的时候,未使用的堆内存会被填充为0xfeeefeee,只要我们把其修改为null,既可绕过反调试
第三个标志ProcessHeap,同样只使用于xp系统ProcessHeap可以通过GetProcessHeap()这个api来获取它指向HEAP结构体的指针第三个flags成员和第四个ForceFlags成员被用作反调试正常情况下flags的值为2 ForceFlags的值为0
第四个标志就是NtGlobaFlag这个 ...
SCTF
@TOC
这次比赛还是发现了自己的很多不足,第一个是内核类的题目比较陌生,导致有几个内核题我帮不上什么忙,再一个就是开发水平太菜了,推箱子那个游戏硬是卡了好长时间,最后差一点点但是放弃了比赛后,也是打算好好的把这次题目复现一下,虽然题目难,但也不至于像看雪那么难~
被师傅们带飞
godness dance这个应该是签到re题里面的签到题,赛后也是看了一下别的wp,直接动态调试,测试几组数据就可以理解程序的逻辑,我当时是动调到一半发现了规律,后面那一大串代码并没有什么阻碍后,把正向算法直接列了出来。
输入长度28位 a~z各一个 再加个i和u正向算法 一共三个循环
123456789101112131415161718192021222324252627282930313233#include<stdio.h>char a[100]={ 0x00000002, 0x0000001A, 0x00000011, 0x0000001C, 0x00000018, 0x0000000B, 0x00000015, 0x0000000A, 0x00000010, ...
arm指令学习
@TOC
简介上一周打hxp的时候,遇到了一个3dsx的题,题目本身是拿arm架构写的,当我想更改汇编代码从而破解游戏的时候,不得以对每一条想知道的汇编指令进行搜索,加上后面用angr爆破的想法也因为arm退却(这个寒假搞定他,我觉得这会是一个很有用的解题手段),所以化了几个小时简单过了一下指令,且边写边学。
arm简介精简指令集(RISC)对于大部分的32位嵌入式都用armarm还有很多很多型号可以参考这个视频:ARM那些你得知道的事儿
寄存器参考######################共有37个32位的寄存器31个通用寄存器6个状态寄存器这些不一定可以同时访问,但r0-r14(通用寄存器),pc/r15(程序计数器),一个状态寄存器可以同时被访问######################r0-r7未分组寄存器r8-r14分组寄存器r15/pc 程序寄存器
r13 常用作堆栈指针sp 类似于rspr14/lr 常用作存储返回地址 (link)r15/pc 当前指令+8个字节 类似于eip+8r16/cpsr 状态寄存器 ...
字节码(Hitcon-cclemon)
@TOC{}在复现hitcon cclemon前,先复习一下python的字节码
python字节码字节码格式:源码行号 | 指令偏移量 | 指令符号 | 指令参数 | 实际参数值
python3.6之前 每条指令三个字节python3.6开始每条指令两个字节(大部分)
常见的字节码指令
12345678910111213141516171819202122232425262728LOAD_GLOBAL#全局变量LOAD_FAST#局部变量LOAD_CONST#常量LOAD_ATTR#对象中的属性ROT_TWO #互换元素STORE_FAST #保存局部变量STORE_GLOBAL#保存全局变量BUILD_LIST #创建列表BUILD_SLICE #创建切片BINARY_SUBSCR # 读取slice 的值STORE_SUBSCR #slice 的值赋值给变量SETUP_LOOP #用于开始一个循环 参数值代表循环结束点JUMP_ABSOLUTE: #结束循环POP_JUMP_IF_FALSE :#条件结果为 FALSE 则跳出 目标的偏移指令JUMP_FORWARD ...
Dragon-runofthemill
@TOC
起因题目长这样,祥云杯类似题我第一反应 拿angr去跑一遍,然后准备喝茶,后来southwood大哥,也写了angr脚本,我就两个一起跑,直到pizza出了后,我明白了一个道理angr=等死
angr做法赛后,也是socular给我发了一个angr脚本,还真是一跑就出来了,就趁着此时,复习了一波angr,把之前的angr知识过了一遍,重新做题这题用到的就是blank对象,条件约束,.bss地址固定写入
123456789p.factory.blank_state.blank_state()#构造了一个“空白石板”空白状态,其大部分数据未初始化。u = claripy.BVS("u", 8)state.memory.store(0x804a021, u)#给bss数据赋值tate.add_constraints(input.get_byte(i) != 0)#添加条件add_options={angr.options.LAZY_SOLVES} #加速用的
作者:acdwas
12345678910111213141516171819202 ...
西湖论剑
@TOC
ror我第一个想到的办法是z3 然后看见下标了,就没有用 ,去手算,事实证明,我脑袋不对
12345678910111213141516171819202122from z3 import*Str=[BitVec(('x%d'%i),8) for i in range(40)]s=Solver()a=[0,181,122,206,37,108,7,223,0,251,124,38,75,62,134,154,0,255,37,144,255,28,56,176,0,231,60,121,225,144,251,30,0,204,179,51,78,145,65,222]v6=[128,64,32,16,8,4,2,1]for i in range(0,40,8): for j in range(0,8,1): v5=((v6[j] & Str[i + 3]) << (8 - (3 - j) % 8)) | ((v6[j] & Str[i + 3]) >> ((3 - j) % 8)) | ( ...
深育杯
@TOC
press类似brainfuck的一个解释器
主要的函数逻辑都在sub_40094b里
经过动态调试后,可以发现逻辑如下1 str=str+0xa02 str=str-flag[i]3 str*=54str+=2
同时前一位的输出作为下一位的输入(str)
写爆破脚本
123456789101112131415161718192021222324252627282930313233343536#include<stdio.h>#include<string.h>unsigned char a[100]={ 0,96 ,225 ,47 ,5 ,121 ,128 ,94 ,225 ,197, 87 ,139, 204 ,92, 154 ,103 ,38 ,30 ,25 ,175 ,147 ,63 ,9 , 226 ,151, 153, 123 ,134 ,193 ,37 , 135, 214, 12 ,221, 207, 42 , 245, 101, 14 , 115, 89 ,29 , 95 , 164 ,244 ...