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的主要内容,如果未能解决你的问题,请参考以下文章

2021 SangFor(羊城杯)-Reverse(逆向) Ez_Android Write up

5-2 学习打卡(9.25)

2021羊城杯(部分web)

安全-2021羊城杯WP(部分)

2021羊城杯(部分web)

[羊城杯2021] wp