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}
随机推荐
- Linux上快速安装 RabbitMQ
1.默认安装最新版,安装erlang apt-get install erlang 2.安装最新版 rabbitmq sudo apt-get update sudo apt-get install ...
- SQL注入漏洞攻击
l-> 对于用户登录的实现,提供SQL语句 •-> select * from 表名 where uid=- and pwd=- •-> 使用字符串拼接 l-> 提供密码为:' ...
- 微软账号密码修改后提示密码错误的解决方法(远程桌面&smb共享访问等)
众所周知,自从微软将Microsoft账户与Windows账号强制绑定后,使用起来便一直有诸多困难,在Microsoft Support和搜索引擎长期搜索解决方案未果,今天偶然在一个佬的博客翻到了这个 ...
- Django使用 DoesNotExist 异常和 Logger 来记录异常情况
代码不仅处理了特定的异常类型,还可以添加更多的调试信息来帮助诊断问题.可以使用 DoesNotExist 异常和 Logger 来记录异常情况. from django.core.exceptions ...
- oeasy教您玩转vim - 90 - # 语法定义syntax
内容查找 grep 回忆 我们这次研究了一下配色方案 murphy虽然配色好看 但是对于java的支持并不好 我们对于murphy进行了修改 增加了String.StorageClass颜色的定义 ...
- JMeter 逻辑控制之IF条件控制器
逻辑控制之IF条件控制器 测试环境 JMeter-5.4.1 循环控制器介绍 添加While Controller 右键线程组->添加->逻辑控制器->While控制器 控制器面板介 ...
- .NET跨平台UI框架Avalonia 11.1重磅发布
本篇为译文 原文地址 https://avaloniaui.net/blog/avalonia-11-1-a-quantum-leap-in-cross-platform-ui-development ...
- 解锁 SQL Server 2022的时间序列数据功能
解锁 SQL Server 2022的时间序列数据功能 SQL Server2022在处理时间序列数据时,SQL Server 提供了一些优化和功能,比如 DATE_BUCKET 函数.窗口函数(如 ...
- 国内外GPT哪家强?对比#ChatGPT #bard #豆包 #bing #百度文心 #星火 #通义千问
#ChatGPT(openAi) ChatGPT已经被错误调教,经常把作者和名字搞混. #豆包(字节跳动) 豆包拒绝错误调教 #百度文心(百度) #星火(科大讯飞) #通义千问 (阿里巴巴) #bar ...
- 【Java】部门集合树状顺序展示
一.需求效果: 表单的部门下拉选择时,可以展示部门的层级: 按照这个效果展示,但是不是树,还是原来的集合 二.实现方案: 用Java代码实现两个部分 1.展示Label效果处理 2.处理集合的树状排序 ...