2021 SangFor(羊城杯)-Reverse(逆向) DeltX Write up
Posted 水番正文
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021 SangFor(羊城杯)-Reverse(逆向) DeltX Write up相关的知识,希望对你有一定的参考价值。
0x00 日常查壳
无壳64位
0x01 分析主函数
验证用户输入的8个类似模块
8个模块都是类似 加起来一共32位
这边有个雷就是验证小写字符
又臭又长?
有四个这样的模块
这时候就得猜一下了 一共有8组4位数 这个代码块里分别会调用到 v6 和 v12 说明一次调用两组数据
于是构造用户输入
SangFor{00010002000300040005000600070008}
0x02 动调主函数
一直往下单步可以看到一个10D0(可以根据IDA)
进入函数判断的地方
向下翻找到这条
是根据ida这条判断
已知信息
1. 程序验证用户的32个数分为8组
2. 下面验证模块也有8个数分为4组
3. 用户的数经过一顿操作和模块的数比较
4. 于是构造用户输入 这时候查看r9d就知道对用户输入的8个数发生什么情况了
继续往下看
r9d变成-1
于是就可以猜一下
1. 第一次操作将两个数变2
2. 第二次操作将两个数变-1
我们的用户输入是1和2
那么等式就是
a = x * y
b = x - y
0x03 GetFlag!
因为最大输入也只是FFFF,可以通过z3爆破出来
z3库没怎么用过 如果有什么好的文章欢迎评论
#"SangFor{00010002000300040005000600070008}"
from __future__ import print_function # python2想用end得用这个库
from z3 import *
def fun1(num1,num2):#eq
s = Solver() #创建一个命令解释器
x,y = Ints('x y')
s.add(x * y == num1) #要记得加这两个要不然会有多解 z3是不会显示用户输入肯定是正数
s.add(x - y == num2) #根据验证用户输入的代码块
s.add(x > 0)
s.add(y > 0)
if s.check() == sat: #如果有解就会有sat如果没有会有unsat
result = s.model() #从model中提取
print(result[x],result[y])
A = [614340037, 885517026, 1668903866, 241160452]
B = [-42564, 8555, 33181, 37779]
for i in range(4):
fun1(A[i], B[i])
C = [11387, 53951, 34341, 25786, 60683, 27502, 43343, 5564]
for i in range(len(C)):
print(hex(C[i])[2:].upper(),end="")
print()
print("SangFor{2C7BD2BF862564baED0B6B6EA94F15BC}") #记得第三组数据BA要成小写
补充:
GetFlag!
以上是关于2021 SangFor(羊城杯)-Reverse(逆向) DeltX Write up的主要内容,如果未能解决你的问题,请参考以下文章