WKCTF RE
WKCTF
so_easy
安卓逆向,关键的check逻辑都在native层里面
主要是很多层的异或操作
除了Z3和爆破想不到其他方法了
from z3 import *
src = [ 0xAE, 0x81, 0xBA, 0xC1, 0xF0, 0x95, 0x0A, 0x54, 0x14, 0x03,
0x4A, 0xE2, 0x52, 0x4E, 0x84, 0xF8, 0xC9, 0x3E, 0x14, 0x98,
0x8F, 0x98, 0xFD, 0x09, 0x5E, 0xAD, 0x05, 0xB4, 0x01, 0x0F,
0xC0, 0x3F]
src1 =0x3FC00F01B405AD5E//自己扣密文
xor_value = BitVecVal(0x71234EA7D92996F5, 64)
v10 = BitVec('v10', 64)
v11=255
# 创建求解器
s = Solver()
for _ in range(v11,0,-5):
v12 = (2 * v10) ^ xor_value
v12 = If(v10 >= 0, 2 * v10, v12)
v13 = (2 * v12) ^ xor_value
v13 = If(v12 >= 0, 2 * v12, v13)
v14 = (2 * v13) ^ xor_value
v14 = If(v13 >= 0, 2 * v13, v14)
v15 = (2 * v14) ^ xor_value
v15 = If(v14 >= 0, 2 * v14, v15)
v10 = (2 * v15) ^ xor_value
v10 = If(v15 >= 0, 2 * v15, v10)
s.add(v10==src1)
# 检查是否有解
if s.check() == sat:
# 如果有解,打印模型
print("6666")
#print chr
print(s.model())
else:
print("No solution exists")
print(hex(9034890700725238114))
quite_easy
调了一下主函数,这个是假的flag,其他也没啥用
TLS回调函数是很明显藏了逻辑的
这两个函数很多花指令,这里选择nop掉jz,第二个函数也一样
下断点开始调试,第一个反调试的地方,改ZF标志位
在第二个函数里面注册了一个新函数,继续下断点
先输入flag: 123456789012345678901234
对应的rand:0x97 0X91 0X51 0X37 0X82...0XFB 0X55
可以看到就是把rand的值继续放到我们输入的后面
输入的值和16次的rand加起来长度需要是48
输入长度是32位
重写开测
12345678901234567890123456789012
后面逻辑就是
前16位和rand异或
后16位与前16位异或
输入与假的flag异或 flag{ed1d665e6516a37ab09f0b7a40}
开始搓脚本
a=[ 0xB1, 0x74, 0x93, 0x32, 0xD6, 0x13, 0xCC, 0x85, 0x20, 0xA8,
0xF4, 0x96, 0x8A, 0xD2, 0x7D, 0x26]
b=[ 0x80, 0xD3, 0x6F, 0xFF, 0x15, 0x03, 0x98, 0x8C, 0xB4, 0x5B,
0x96, 0xC0, 0x59, 0xAC, 0x18, 0xDF, 0x2D, 0xCE, 0x3F, 0xFB,
0xC4, 0xED, 0xD8, 0xD2, 0xA8, 0x2D, 0xF8, 0x23, 0x9F, 0x22,
0x25, 0xCE]
c=[ord(i) for i in "flag{ed1d665e6516a37ab09f0b7a40}"]
for i in range(32):
b[i]=(b[i]+c[i] )& 0xff
for i in range(16):
b[i]^=a[i] & 0xff
for i in range(16,32):
b[i]^=b[i-16] & 0xff
for i in range(32):
print(chr(b[i]),end="")
#WKCTF{08898c40064d1fc4836db94fe}
随机推荐
- java中的即时编译(JIT)简介
Java发展这么多年一直长青,很大一部分得益于开发人员长期对其坚持不懈的优化:写得更少,跑得更快!JIT就是其中一项十分重要的优化. JIT全程Java Intime Compiler,即Java即时 ...
- SpringBoot集成实时通讯WebSocket和其它代替方案
WebSocket 双向实时通讯 一.添加WebSocketConfig配置类 /** * 开启WebSocketConfig */ @Configuration public class WebSo ...
- Spring常见面试题总结
Spring是什么? Spring是一个轻量级的IoC和AOP容器框架.是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求.常见的配置方式有 ...
- CF580C
说句实话,这道题作为蓝题过于简单了一点 #include<iostream> #include<utility> #include<vector> using na ...
- 【算法】用c#实现自定义字符串编码及围栏解码方法
编写一个函数/方法,它接受2个参数.一个字符串和轨道数,并返回ENCODED字符串. 编写第二个函数/方法,它接受2个参数.一个编码字符串和轨道数,并返回DECODED字符串. 然后使用围栏密码对其进 ...
- [oeasy]python0011_ 字符序号_ordinal_ord
序号(ordinal) 回忆上次内容 hello world 不是从来就有的 来自于unix和c 虽然我们今天有各种先进的学习手段 最早的高级语言学习是从最早的那张打字机用纸 ...
- Geostudio简单实现边坡安全系数的计算
Geostudio是加拿大团队开发的用于岩土工程稳定性分析的一款工程软件,里面的安全系数的计算基本都是基于极限平衡法原理进行求解的,SLOPE/W模块用于安全系数的求解.SEEP/W模块考虑渗水作用. ...
- TypeScript快速上手
TypeScript快速上手 参考TypeScript零基础入门 轻松搞定ts进行整理 TS文档:TypeScript: The starting point for learning TypeScr ...
- GraphRAG介绍
GraphRAG GraphRAG 是一种基于图的检索增强方法,由微软开发并开源.它通过结合LLM和图机器学习的技术,从非结构化的文本中提取结构化的数据,构建知识图谱,以支持问答.摘要等多种应用场景. ...
- 【js】 reduce、filter、map 数组链式调用求加和
let data = [ {hierarchy: '香蕉', count: 1}, {hierarchy: '苹果', count: 2}, {hierarchy: '葡萄', count: 3}, ...