[GXYCTF2019]simple CPP

前言

三个加密区域,第一次是基本运算,八位叠加,z3方程

分析

第一轮加密,和Dst中模27异或

(出题人对动调有很大意见呢)

将输入的字符串按八位存入寄存器中,然后将寄存器内容转存到内存

第一次分析一团雾水,看师傅们题解后,发现是五个方程组,可以直接用Z3

wp

python 复制代码
from z3.z3 import Solver, Ints, sat, BitVecs

s=Solver()
x,y,z,w =BitVecs('x y z w',64)
s.add((~x)&z==1176889593874)
s.add(((z&~x)|(x&y)|(z&(~y))|(x&(~y)))^w==4483974543195470111)
s.add(((z&~y)&x|z&((x&y)|y&~x|~(y|x)))==577031497978884115)
s.add(((z&~x)|(x&y)|(z&~y)|(x&~y))==4483974544037412639)
s.add(((z&(~x)) | (x&y) | y & z) == (((~x)& z)|864693332579200012))
if s.check() ==sat:
    print(s.model())
else:
    print(s.check())
key = 'i_will_check_is_debug_or_not'
arr1 =[0x3e,0x3a,0x46,0x05,0x33,0x28,0x6f,0x0d,0x1,0x08,0x48,0x00,0x00,0x80,0x00,0x04,0x8,0x02,0x07,0x17,0x15,0x3e,0x30,0x13,0x32,0x31,0x06]
for m in range(len(arr1)):
    print(chr(arr1[m]^ord(key[m%27])),end='')
#y的正确值为"e!P0or_a"带入为
#We1l_D0ne!P0or_algebra_am_i

BitVecs(name, bv, ctx=None): 创建一个有多变量的位向量,name是名字,bv表示大小。

相关推荐
CYRUS_STUDIO3 天前
静态分析神器 + 动态调试利器:IDA Pro × Frida 混合调试实战
android·逆向
CYRUS STUDIO4 天前
FART 自动化脱壳框架优化实战:Bug 修复与代码改进记录
android·自动化·逆向·fart
CYRUS_STUDIO4 天前
静态分析根本不够!IDA Pro 动态调试 Android 应用的完整实战
android·逆向
CYRUS_STUDIO4 天前
攻防 FART 脱壳:实现 AJM 壳级别的对抗功能 + 绕过全解析
android·安全·逆向
CYRUS_STUDIO5 天前
深入内核交互:用 strace 看清 Android 每一个系统调用
android·操作系统·逆向
CYRUS_STUDIO5 天前
别再手工写 Hook 了!Python + Frida 一网打尽 SO 层动态注册 JNI 调用
android·c++·逆向
CYRUS_STUDIO6 天前
FART 脱壳不再全量!用一份配置文件精准控制节奏与范围
android·c++·逆向
CYRUS_STUDIO6 天前
FART 自动化脱壳框架优化实战:Bug 修复与代码改进记录
android·操作系统·逆向
CYRUS STUDIO6 天前
Frida + FART 联手:解锁更强大的 Android 脱壳新姿势
android·逆向
CYRUS_STUDIO7 天前
Frida + FART 联手:解锁更强大的 Android 脱壳新姿势
android·操作系统·逆向