神光
还是想了一下,但那个异或搞不出来,都是对dword_41A038操作,想起开头就给了 key ,还有反调试应该是要调试的
输出的应该就是 flag ,只是为什么是乱码呢?
放 od 再试试,直接就出 flag 了,强!!!
有点坑人 0_0
BBBigEqSet
好像是大端序的意思
这么多变量,记得可以用 angr 还是 pwntools 爆破
这么多肯定是不用 z3 了
一些师傅看的汇编(ida不能f5),确实汇编可以看出都是一样的操作:
movzx eax, [rbp+s]
零扩展并移动数据指令,0x1234–>0x00001234
movsx eax, al
符号扩展并移动数据,用符号扩展补充高位
0xff–>0xFFFFFFFF , 0x7f -->0x0000007F
imul edx, eax, 9421h
有符号整数乘法, eax * 0x9421 得到一个64位结果,高32位存到edx,低32位存到eax
嗯,找规律哈哈哈哈
厉害了我嘞个豆
然后比较重要的就是提取数据
def u32(a):return a[3]<<24 | a[2]<<16 | a[1]<<8 | a[0]#1
data = open('BBBigEqSet', 'rb').read()[0x11c7:0x11c7+ 0x909*0x80]
print(hex(len(data)))
taba = []
tabb = []
for i in range(0x80):stab=[0]*0x80ptr = 12for j in range(0x80):stab[j] = u32(data[ptr: ptr+4])ptr+=18if j==0:ptr-=2ptr -= 11taba.append(stab)tabb.append(u32(data[ptr: ptr+4]))data = data[0x909:]print(taba, tabb)#2
import numpy as np
an = np.array(taba)
bn = np.array(tabb)x = np.linalg.solve(an,bn)
print(x)
print(bytes([round(i) for i in x]))
#flag{Soooo000_LooOOOOOOOOggO99g99_s1muLtaNeOus_EEEQuat10n5_Y0UUUUUUuuu_cAA44AANNnnN_SOOOOOOLVE_IT17TT11771ITIT!!!_8ShotDshP90ab}
但 ida python 有点问题,我不能导入模块,烦死
唉,我的 8.3的ida 可以,0_0
总结:
这个脚本蕴含了 dword 数据转32位数据,ida脚本提取数据,还有 numpy 库的使用
签到
动调一下
要找到输入所存的变量,看函数应该是 v8 或者 v10
就是 v8 , v6 要等于0
# -*- coding:utf-8 -*-model = [102, 109, 99, 98, 127, 58, 85, 106, 57, 82, 122, 55, 81, 19, 51, 35, 67, 70, 41, 61, 41, 32, 127, 28, 38, 77,49, 20, 80, 94]
flag = ''for i, val in enumerate(model):flag += chr(0 ^ i ^ (i + (i ^ val)))
print (flag)
用到了枚举 i 是索引,val 是值
或者这样
tiny
我 PE 结构还没学完呢 0_0
文件头不对?
后面几个没看懂
嗯,这个先留着吧