WKCTF

so_easy

安卓逆向,关键的check逻辑都在native层里面

主要是很多层的异或操作

除了Z3和爆破想不到其他方法了

  1. from z3 import *
  2. src = [ 0xAE, 0x81, 0xBA, 0xC1, 0xF0, 0x95, 0x0A, 0x54, 0x14, 0x03,
  3. 0x4A, 0xE2, 0x52, 0x4E, 0x84, 0xF8, 0xC9, 0x3E, 0x14, 0x98,
  4. 0x8F, 0x98, 0xFD, 0x09, 0x5E, 0xAD, 0x05, 0xB4, 0x01, 0x0F,
  5. 0xC0, 0x3F]
  6. src1 =0x3FC00F01B405AD5E//自己扣密文
  7. xor_value = BitVecVal(0x71234EA7D92996F5, 64)
  8. v10 = BitVec('v10', 64)
  9. v11=255
  10. # 创建求解器
  11. s = Solver()
  12. for _ in range(v11,0,-5):
  13. v12 = (2 * v10) ^ xor_value
  14. v12 = If(v10 >= 0, 2 * v10, v12)
  15. v13 = (2 * v12) ^ xor_value
  16. v13 = If(v12 >= 0, 2 * v12, v13)
  17. v14 = (2 * v13) ^ xor_value
  18. v14 = If(v13 >= 0, 2 * v13, v14)
  19. v15 = (2 * v14) ^ xor_value
  20. v15 = If(v14 >= 0, 2 * v14, v15)
  21. v10 = (2 * v15) ^ xor_value
  22. v10 = If(v15 >= 0, 2 * v15, v10)
  23. s.add(v10==src1)
  24. # 检查是否有解
  25. if s.check() == sat:
  26. # 如果有解,打印模型
  27. print("6666")
  28. #print chr
  29. print(s.model())
  30. else:
  31. print("No solution exists")
  32. 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}

开始搓脚本

  1. a=[ 0xB1, 0x74, 0x93, 0x32, 0xD6, 0x13, 0xCC, 0x85, 0x20, 0xA8,
  2. 0xF4, 0x96, 0x8A, 0xD2, 0x7D, 0x26]
  3. b=[ 0x80, 0xD3, 0x6F, 0xFF, 0x15, 0x03, 0x98, 0x8C, 0xB4, 0x5B,
  4. 0x96, 0xC0, 0x59, 0xAC, 0x18, 0xDF, 0x2D, 0xCE, 0x3F, 0xFB,
  5. 0xC4, 0xED, 0xD8, 0xD2, 0xA8, 0x2D, 0xF8, 0x23, 0x9F, 0x22,
  6. 0x25, 0xCE]
  7. c=[ord(i) for i in "flag{ed1d665e6516a37ab09f0b7a40}"]
  8. for i in range(32):
  9. b[i]=(b[i]+c[i] )& 0xff
  10. for i in range(16):
  11. b[i]^=a[i] & 0xff
  12. for i in range(16,32):
  13. b[i]^=b[i-16] & 0xff
  14. for i in range(32):
  15. print(chr(b[i]),end="")
  16. #WKCTF{08898c40064d1fc4836db94fe}

随机推荐

  1. mac navicat免激活版

    Navicat 12 第一步:终端执行 sudo spctl --master-disable 第二步:下载安装即可使用 https://pan.baidu.com/s/1tHq-wqAIggD0Fo ...

  2. Using temporary与Using filesort

    Using temporary Using temporary表示由于排序没有走索引.使用union.子查询连接查询.使用某些视图等原因(详见https://dev.mysql.com/doc/ref ...

  3. 可视化—gojs 超多超实用经验分享(三)

    目录 32.go.Palette 一排放两个 33.go.Palette 基本用法 34.创建自己指向自己的连线 35.设置不同的 groupTemplate 和 linkTemplate 36.监听 ...

  4. [oeasy]python0081_ANSI序列由来_终端机_VT100_DEC_VT选项_终端控制序列

    更多颜色 回忆上次内容 上次 首先了解了RGB颜色设置 可以把一些抽象的色彩名字 落实到具体的 RGB颜色 计算机所做的一切 其实就是量化.编码 把生活的一切都进行数字化 标准 是ANSI制定的 这个 ...

  5. TIER 2: Oopsie

    TIER 2: Oopsie Web 渗透 此次靶机结合前面知识,非常简单: nmap 扫描,发现 22 和 80 端口开放 服务 80 的 HTTP 服务 之后使用继续 Web 渗透: 使用 Wap ...

  6. Sysbench 使用总结

    Sysbench使用总结 实践环境 CentOS 7.8 Sysbench 1.0.20 下载地址:https://github.com/akopytov/sysbench/archive/refs/ ...

  7. vs 常用的调试技巧

    本地调试,一般打断点, 然后下一步,或者步入,或者运行到上一步. 有专用的对战窗口. 条件断点,输入当前变量的名称,然后打印变量值变量名和对战的一些信息,当然也可以选择进入断点后是否进一步运行 线程调 ...

  8. CCF 命令行选项

    题目原文 问题描述(题目链接登陆账号有问题,要从这个链接登陆,然后点击"模拟考试",进去找本题目)   试题编号: 201403-3 试题名称: 命令行选项 时间限制: 1.0s ...

  9. JAVA并发编程理论基础

    注:本文章是对极客时间<java并发编程实战>学习归纳总结,更多知识点可到原文 java并发编程实战 进行学习.如果侵权,联系删除: 一.并发编程的BUG的源头 1.1 缓存导致的可见性问 ...

  10. [香橙派开发系列]3b系统安装和使用vscode进行远程连接

    目录 前言 一.下载镜像和安装系统 二.使用串口助手进行调试 三.查看系统的ip地址 四.使用vscode连接香橙派 最后 前言 之前研究中断的时候一直出现问题,我怀疑是因为zero 3不支持,所以一 ...