TEA家族
TEA家族一、tea算法1.简介:TEA算法全称微型加密算法(Tiny Encryption Algorithm)是一种简单容易实现的加密算法,通常只需要很少的代码就可以实现。 TEA算法是由剑桥大学计算机实验室的David Wheeler和Roger Needham于1994年发明的一种分组密码算法。其特点是加密速度快,密钥长度为128比特(16字节),明文和密文块长度均为64比特(8字节)。TEA算法采用Feistel网络结构,通过一系列的线性变换和密钥轮来确保加密的安全性。 2.tea算法核心特征: .DELTA值和十六个字节(128bit)的密钥 .可以利用ida的插件findcypto识别tea算法 .x -=0x61c88647和x +=0x9e3779b9,这两个值是等价的,可能会在反汇编中看到 3.tea加密算法原理:1uint32_t v[2] = {*(uint32_t *)&input[i], *(uint32_t *)&input[i+4]}; 这行代码将 input 数组中的字节强制转换为 uint32_t 类型。这里就体现了...
rc4
rc4加密过程 密钥调度算法(KSA)(Key Scheduling Algorithm) 初始化一个长度为256的数组S,值为S[i]=i,其中i是索引. 根据密钥(char类型)和S[i]生成j,S[j],并进行置换: j=0 j=j+S[i]+key[i%len(key)]%256 交换S[i]和S[j] 伪随机数生成算法(PRGA) 初始化两个索引变量:i,j=0 i = (i+1)%256 j = (j+s[i])%256 交换S[i]和S[j] t = ( S[i]+S[j] )%256 KEY = S[t]
z3约束求解器
z3约束求解器一、z3约束求解器理解 z3介绍Z3是由微软公司开发的一个优秀的SMT求解器,它能够检查逻辑表达式的可满足性,可以用来软件/硬件验证和测试,约束求解,混合系统分析,安全性研究,生物学研究(计算机分析)以及几何问题。通俗的来讲我们可以简单理解为它是一个解方程的计算器,Z3py是使用脚本来解决一些实际问题。 z3在CTF逆向中有什么用?我们在做CTF逆向题的时候,当我们已经逆向到最后求flag或者具体数值解的时候,例如最简单的:我们知道了未知量x,y,也知道了约束条件x+y=5,那么此时我们就可以使用Z3来求解x和y的值,因为x和y的值肯定有多个解,而我们最后的flag肯定只有一个,那么我们就可以继续添加约束条件来减少解的数量,最后得出正确的flag。 二、z3语法简介:z3在python中的未知数变量主要有以下数据类型: Int –> 整型(注意逐个列出时使用Int(),一次全部列出使用Ints())。 12345a,b,c,d=Ints('a b c d')# a = Int('a')# b = Int('b')# c = Int('c')# d = ...
常见函数用法
常见函数用法1.read1read(0, buf, 0xAuLL); 用法: 12ssize_t read(int fd, void *buf, size_t count);bash 参数解释: fd:文件描述符,表示要读取的文件或者输入源。在 UNIX 系统中,0 表示标准输入(STDIN),1 表示标准输出(STDOUT),2 表示标准错误(STDERR)。 文件描述符0:用于接收用户输入或者从管道、重定向或者其他输入源读取数据。 文件描述符1:用于向终端或者其他输出目标输出数据。 buf:指向存储读取数据的缓冲区的指针。 count:要读取的最大字节数。 注:0xAuLL 中的 uLL 表示这是一个无符号长长整型(unsigned long long)的常量,sleep(0x1BF52u)中的u表示无符号整型(unsigned)。 2.strcat1strcat(dest, buf); 这行代码将用户输入的内容追加到 dest 字符串后面 双击跟进 dest 可以看到 dest 被声明为一个大小为 4 字节的字符数组,用来存储字符串 详细解释: dest 是一...
寄存器寻址方式
寄存器寻址section .data msg db “Welcome_to_CTFshow_PWN”, 0 section .text global _start _start: ; 立即寻址方式 mov eax, 11 ; 将11赋值给eax add eax, 114504 ; eax加上114504 sub eax, 1 ; eax减去1 ; 寄存器寻址方式 mov ebx, 0x36d ; 将0x36d赋值给ebx mov edx, ebx ; 将ebx的值赋值给edx ; 直接寻址方式 mov ecx, msg ; 将msg的地址赋值给ecx**(找msg的地址)**。 ; 寄存器间接寻址方式 mov esi, msg ; 将msg的地址赋值给esi mov eax, [esi] ; 将esi所指向的地址的值赋值给eax**(等于找msg地址存储的值)**。 ; 寄存器相对寻址方式 mov ecx, msg ...
Android动态调试小记
安卓动态调试——apk加上动态可调试属性 刷了一下2024xyctf的DebugMe题目,记一下这次动态调试过程。 用jeb打开后看到有调试检查,再根据题目提示为动态调试。知道需要进行动调。 先用雷电模拟器在程序里面运行这个程序,接着用adb测试远程连接:输入adb devices。如图显示就算端口连接好了。 adb devices -l查看连接的设备 adb shell ps查看线程状态 然后才能在jeb里面点击调试器或者甲虫下图标进行动态调试,不然会显示调试的目标不存在。 点击attach附上。 提示程序不可调试nondebuggable。 提示无法attach上。 一、用Android Killer编译的方法修改apk为可调式 用Android Killer打开apk,可以解包这个程序。 点开AndroidMainfest.xml,在<application那一行后面加上android:debuggable=”true”这个属性(记得要ctrl+s保存)。 把...
“gcc编译”
C++编译全过程 gcc flag.c -o flag(用gcc编译成可执行文件) 一、四个步骤: 预处理(Processing) gcc -E flag.cpp -o flag.ii -E Preprocess only; do not compile, assemble or link. 编译(Compilation) gcc -S flag.ii -o flag.s -S Compile only; do not assemble or link. 汇编(Assemble) gcc -c flag.s -o flag.o -c Compile and assemble, but do not link. nasm -f elf64 -o flag.o flag.asm # 使用 nasm 将 .asm 文件编译成 .o 文件 (有的asm文件nasm汇编后需要这样操作,因为他是NASM语法编写的代码,gcc无法直接处理) 链接(linking) ...
汇编助记符
offset取偏移地址,不去地址的值。 [esi]指向对应地址的值。
Base64编码解析
Base64编码解析 计算机单位解析一、位,字节,的定义1.bit(Binary Digits)就是二进制数字中的位,是信息量的度量单位,为信息量的最小单位,也叫比特位,存放一位二进制数,即0或1,是计算机表示数据最小的单位。 (b) 2.byte就是字节,字节(Byte)是计量单位,是计算机的基本存储单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位.通常情况下一字节等于8位,一个字节由8个相邻的二进制位组成,每个位由0或1组成。字节是计算机技术中最小的可操作存储单位。 (B) ASCII 使用 7 位二进制 表示字符,总共可以表示 2⁷ = 128 个字符 虽然是 7 位,但通常用 8 位(1 字节)存储 二、换算 1byte=8bit 1KB=1024B 1MB=1024KB 1G=1024MB 1tb=1024gb 1pb=1024tb 1字节=8位二进制=2个十六进制字符 三、字节与字符 字符的定义: 字符(Character)计算机中使用的字母、数字、字和符...
f5报错的几种类型
f5生成伪代码出错的几种类型 常见F5出错信息1.posutuve sp value has been found 成因:IDA会自动分析SP寄存器的变化量,由于缺少调用约定、参数个数等信息,导致分析出错。 一般是程序代码有一些干扰代码,让IDA的反汇编分析出现错误。比如用push + n条指令 + retn来实际跳转,而IDA会以为retn是函数要结束,结果它分析后发现调用栈不平衡,因此就提示sp analysis failed。 解决方案:Option->General设置显示Stack Pointer,检查对应地址附近的调用约定以及栈指针变化。直接使用alt+k修改sp指针,将其修改为应有的值即可(可以改为指向上一行的sp或者修改为0)。(有风险) 2. cannot convert to microcode 成因:部分指令无法被反编译,有未设置成指令的数据字节。 解决方案: 最常见起因是函数中有未设置成指令的数据字节,按c将其设置为指令即可。 其次常见的是x86中的rep前缀,比如repxx jmp等。可以将该指令的第一个...
攻防世界re题目
攻防世界逆向题目一、1000click思路一:点开程序后发现是游戏,点击1000下可以获得flag,利用CE可以破解游戏。 打开程序 click一下,修改数值,首次扫描。 随便click,输入click后的值再次扫描。 得到唯一的基址,双击基址添加它。 双击下面的数值更改它成999。 最后点击程序click一下,得到flag 思路二:利用ida静态分析。 点击程序check,出现error。 查壳发现是32位的无壳,拖入idax32。 在字符串处查找error。 跟进,ctrl x交叉引用 向上划一下便得到flag。
启航杯rewp
.rainbow一、rainbow1>查壳拖入ida查看伪代码 点击跟进hide-flag。 2>分析代码点开 xor_encrypt发现是简单的异或,分析得出flag异或后得到encryped-flag。 打开output文件。 3>写脚本发现是十六进制字符串,写代码把它转换成字节再进行异或即可得到flag。 二、小明的note1>查壳拖入idaupx -d脱壳,进入主函数查看伪代码。 2>分析伪代码进入decryped_flag,发现是dest的异或,又是异或!并且v6又是十六进制字符,要转化为字节。 a1是dest,即长度便是dest的长度 往前看发现unk_2010值赋给了dest,查看unk_2010。 3>写脚本 三、checker查壳32位ida分析,跟进check_flag,跟进encrypt flag,发现又是异或。 再查看encrypted_flag 写脚本