文件无壳 将文件拖入ida中
shift+F12查看可疑字符串
双击进去 F5查看伪c代码 代码非常长
Block的输入可能为flag。
输入的字符串与一组字符串异或后,每8个字节一赋值给4个变量v16,v15,v14,v13。
利用Z3求解器求解 代码是这位师傅的
from z3 import *
v14,v15,v16,v13=BitVecs('v14 v15 v16 v17',64)
s=Solver()
s.add((v14 & ~v16) == 0x11204161012)
s.add((v14 & (~v15)) & v16 | v14 & ((v15 & v16) | v15 & ~v16 | ~(v15 | v16)) == 0x8020717153E3013)
s.add((((v14 & ~v16) |(v15 & v16) | (v14 & (~v15)) | (v16 & (~v15))) ^ v13) == 0x3E3A4717050F791F)
s.add(((v14 & ~v16) | (v15 & v16) | v15 & v14) == (~v16 & v14 | 0xC00020130082C0C) )
s.add((((v14 & ~v16) |(v15 & v16) | (v14 & (~v15)) | (v16 & (~v15)) == 0x3E3A4717373E7F1F)))
s.check()
m = s.model()
for i in m:
print("%s = 0x%x"%(i,m[i].as_long()))
得到
下一步寻找qword_140006048内容
编写脚本
b = 'i_will_check_is_debug_or_not'
a = [0x3E, 0x3A, 0x46, 0x05, 0x33, 0x28, 0x6F, 0x0D, 0x8C, 0x00, 0x8A, 0x09, 0x78, 0x49, 0x2C, 0xAC, 0x08, 0x02, 0x07,
0x17, 0x15, 0x3E, 0x30, 0x13, 0x32, 0x31, 0x06]
flag = ''
# 循环遍历数组a中的每个元素
for i in range(len(a)):
# 使用模运算来循环遍历字符串b
# 这确保了我们可以从b中安全地获取一个字符,而不会发生索引越界
index_b = i % len(b)
# 将a中的元素与b中对应索引的元素进行异或操作
flag += chr(a[i] ^ ord(b[index_b]))
print(flag)
得到flag
将中间一节乱码替换为e!P0or_a即得到flag
flag{We1l_D0ne!P0or_algebra_am_i}