标签:24 buuctf simple v13 v16 flag v14 v15 add
[GXYCTF2019]simple CPP
前话:遇到复杂的代码别慌,开着动态调试,编写注释便往下步过,总会结束
hint:flag中间有一段乱码,因为构建的Z3表达式有多组解,乱码应为e!P0or_a
ida打开,代码很长
在此之上的代码,就是输入的字符串与一组字符串异或后,每8个字节一赋值给4个变量v16,v15,v14,v13。
将这一步每个式子都用变量v16,v15,v14,v13构建等式。最终会得到5个等式。
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)))
写脚本跑出四个变量的值
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内容
通过交叉引用发现
得到i_will_check_is_debug_or_not
编写解密脚本
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 = ''
for i in range(len(a)):
flag += chr(a[i] ^ ord(b[i]))
print(flag)
得到
将中间一节乱码替换为e!P0or_a即得到flag
标签:24,buuctf,simple,v13,v16,flag,v14,v15,add 来源: https://blog.csdn.net/weixin_45847059/article/details/121664222
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。