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}

随机推荐

  1. SQL如何优化和设计索引

    SQL优化 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引: 避免使用 NULL 字段,很难查询优化且占用额外索引空间,可以设置默认值0或'': ...

  2. WebUi爬虫自动化测试 Selenium4.X+Java教程

    为什么要学习Selenium 自动化测试 Selenium是最受欢迎的Web应用程序自动化测试工具之一. 通过学习Selenium,可以编写自动化测试脚本,用于自动执行各种任务,例如验证功能.测试用户 ...

  3. MySQL 并发控制(锁得使用)

    导读 并发问题:同一时刻进行读写,并发问题回引发数据不一致问题. 解决并发问题:MySQL采用了锁定机制去解决并发问题 锁的分类 MySQL使用两种锁机制去解决问题:共享锁和排他锁,也叫读锁或者写锁. ...

  4. C++ 中的 lowbit

    lowbit 的定义 首先了解 lowbit 的定义 \(lowbit(n)\) ,为 \(n\) 的二进制原码中最低的一位 \(1\) 以及其后面的 \(0\) 所表示的数 举个简单的例子: 将 \ ...

  5. FairMOT复现报错存档

    FairMOT复现 使用pip命令单独安装Cython包即可 修改下载的cython-bbox包里的setup.py里的代码 将#extra_compile_args=['-Wno-cpp'], 修改 ...

  6. QCon 回顾 | Data Fabric:逻辑统一、物理分散

    Data Fabric(数据编织),自 2019 年开始就在 Gartner 年度技术趋势榜单上安家,并在 2022 年被列为数据分析领域十大技术趋势之首,它究竟有哪些价值?又如何在企业落地? 在近日 ...

  7. SQL查询语句汇总

    SQL查询语句汇总 students表 id class_id name gender score 1 1 小明 M 90 2 1 小红 F 95 class表 id name 1 一班 2 二班 3 ...

  8. vue中 lang="ts"与js的区别

    `lang="ts"` 与 `js` 的区别在于指定了脚本语言的类型,其中: - `lang="ts"` 指定了 TypeScript,一种由微软开发的 Jav ...

  9. 解码 xsync 的 map 实现

    解码 xsync 的 map 实现 最近在寻找 Go 的并发 map 库的时候,翻到一个 github 宝藏库,xsync (https://github.com/puzpuzpuz/xsync) . ...

  10. CSP2023

    坐标HA 背景 NOIP都打完了,CSP-S都没写游记,所以来补一篇(逃-- 正文 Day 7*-1 考前一周停课集训,被whk老师怒斥不务正业,悲QWQ. Day 0 周五得到年级第一zyx的鼓励, ...