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!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值