unity 游戏,直接输入字符串
直接修改 if 判断,看能不能直接输出flag
修改了程序逻辑,但还是输出了
明明已经把这个 if 删了
不知道为什么还会输出这串字符
应该程序还有什么引入吧,看 wp 应该先查一下程序的动态链接库
DLL 是一个包含可由多个程序同时使用的代码和数据的库
动态链接,就是把一些经常会共享的代码(静态链接的OBJ程序库)制作成DLL档,当可执行文件调用到DLL档内的函数时,Windows操作系统才会把DLL档加载存储器内,DLL档本身的结构就是可执行档,当程序有需求时函数才进行链接。通过动态链接方式,存储器浪费的情形将可大幅降低。静态链接库则是直接链接到可执行文件。
静态库:二进制文件(通常扩展名为.LIB)和应用程序的其他模块组合起来创建最终的可执行文件(.EXE文件)
动态库:往往提供两个文件:一个引入库(.lib)文件和一个DLL (.dll) 文件
当某个程序或 DLL 使用其他 DLL 中的 DLL 函数时,就会创建依赖项。 该程序不再是独立的,并且如果该依赖项被损坏,该程序就可能遇到问题。 例如,如果发生下列操作之一,则该程序可能无法运行:
- 依赖 DLL 升级到新版本。
- 修复了依赖 DLL。
- 依赖 DLL 被其早期版本覆盖。
- 从计算机中删除了依赖 DLL。
这些操作通常称为 DLL 冲突。
这个函数把字符串str先base64解码再des解密
注意,在C#中,字符串默认是Unicode(utf-16)字符串,所以转成字节数组,在每个字符字节后都要加一个"\x00"
# python3
import base64
from Crypto.Cipher import DESencryptData = "1Tsy0ZGotyMinSpxqYzVBWnfMdUcqCMLu0MA+22Jnp+MNwLHvYuFToxRQr0c+ONZc6Q7L0EAmzbycqobZHh4H23U4WDTNmmXwusW4E+SZjygsntGkO2sGA=="
e = base64.b64decode(encryptData)
keyiv = b"1\x002\x003\x004\x00"d = DES.new(keyiv, DES.MODE_CBC, keyiv)
print(d.decrypt(e).decode("utf-16"))
# He_P1ay_Basketball_Very_We11!Hahahahaha!
提交不对
patch Assembly-CSharp.dll,发现不论怎么改(比如直接弹出 flag、输入框的内容改为 flag),程序都没有变动,于是猜测按钮部分的功能在另外的 dll 中进行了实现。来到 Data/Managed 目录下,按修改日期对所有 dll 进行排序:
继续用 dnspy 打开 ,没有什么用
看 wp 是要用 CE 打开,
没有 .NET好看
这个和 Assembly-Csharp 很像
撕,为什么不能运行
import base64
from Crypto.Cipher import DESencryptData = "xZWDZaKEhWNMCbiGYPBIlY3+arozO9zonwrYLiVL4njSez2RYM2WwsGnsnjCDnHs7N43aFvNE54noSadP9F8eEpvTs5QPG+KL0TDE/40nbU="
e = base64.b64decode(encryptData)
keyiv = b"t\x00e\x00s\x00t\x00"d = DES.new(keyiv, DES.MODE_CBC, keyiv)
print(d.decrypt(e).decode("utf-16"))
还有直接 CE 暴力搜索的
别人扫了五六个,我就两个,不知道为啥
from pyDes import des,PAD_PKCS5,CBC
import base64
s1=base64.b64decode('q+w89Y22rObfzxgsquc5Qxbbh9ZIAHET/NncmiqEo67RrDvz34cdAk0BalKWhJGl2CBYMlr8pPA=')
key1=''.join(['1','\x00','2','\x00','3','\x00','4','\x00'])
des_obj=des(key1,CBC,key1,padmode=PAD_PKCS5)
m=des_obj.decrypt(s1)
print(m.decode('UTF-16'))
s2=base64.b64decode('xZWDZaKEhWNMCbiGYPBIlY3+arozO9zonwrYLiVL4njSez2RYM2WwsGnsnjCDnHs7N43aFvNE54noSadP9F8eEpvTs5QPG+KL0TDE/40nbU=')
key2=''.join(['t','\x00','e','\x00','s','\x00','t','\x00'])
des_obj=des(key2,CBC,key2,padmode=PAD_PKCS5)
m=des_obj.decrypt(s2)
print(m.decode('UTF-16'))
也得到了key , data.
最后来看一下 AES 和 DES
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes# 16字节密钥(AES-128)
key = b'16bytekey1234567'
# 16字节随机生成的IV
iv = get_random_bytes(16)# 创建一个AES对象,使用CBC模式
cipher = AES.new(key, AES.MODE_CBC, iv)
from Crypto.Cipher import DES
from Crypto.Random import get_random_bytes# 8字节密钥
key = b'8bytekey'
# 8字节随机生成的IV
iv = get_random_bytes(8)# 创建一个DES对象,使用CBC模式
d = DES.new(key, DES.MODE_CBC, iv)
AES key可以是 16,24,32位。
DES必须 8 位