侧防
IDA打开程序
写脚本逆向即可
str_enc = "Lx|dTUwe\IvNhCBOLqDNfW}ImFZCtiyxO\PW^ebD"
str_ = []
for i in range(0,len(str_enc ), 4):
str_ .append(str_enc [i+1])
str_ .append(str_enc [i+2])
str_ .append(str_enc [i+3]).
str_ .append(str_enc [i])
print "".join(str_ )
# x|dLUweTIvN\CBOhqDNLW}IfFZCmiyxt\PWOebD^
keys = [ord(i) for i in "QWBlogs"]
flag = [ord(i) for i in "x|dLUweTIvN\CBOhqDNLW}IfFZCmiyxt\PWOebD^"]
for i in range(len(flag )):
flag [i] = (flag[i] - 65) ^ keys [i % 7]
print "".join([chr(i) for i in flag ] )
# flag{QWB_water_problem_give_you_the_scor
# 最后e}即为flag
xx_warmup_obf
这道题用了大量的混淆,去掉混淆之后其实就是一个方程,Z3解就可以了
下面我当时的分析过程
在init函数里发现有大量的赋值,并注册了异常处理函数
调试起来,将handler还原,发现跟flag的判断并没有关系(这里是配合混淆的。)
这里说一下,最初在调试的时候遇到int 3 IDA就截获了这个信号,并没有把他传给程序
打开IDA调试器选项
这样设置,可以将信号传给程序,以便于调试
进入main函数,发现有大量的混淆
比如这里,每次运行到类似于这种地方的跳转,每一次都是固定的,其实不用管它,一步步跟,直到处理flag的函数那里
最终发现402968是处理flag 的函数
将没用的代码全部NOP掉,在NOP的时候可以用PatchByte函数 NOP
比如这样
START = 0X0402977
END = 0X402D04
for i in range(START, END, 1):
PatchByte(i, 0X90)
全部nop掉之后,发现程序一共28块,每一块是对flag的一个字符进行验证
每一块后面有大量的NOP,但是这样F5之后,只有一个return 1 因为每一块不管失败还是错误都是返回1,所以IDA在解析的时候这个函数就只有一个return 1
在每一个NOP位置添加几条jmp,然后再末尾添加一个mov [rbp+Var_C], 0 使其如果判断错误,就跳到这里来,函数返回0
进入图形界面,修改完毕
然后F5
发现程序是个方程,将方程提取出来,然后Z3解方程即可
from z3 import *
s = Solver()
NUM = 28
flag = [0]*NUM
for i in range(NUM):
flag[i] = Int('flag['+str(i)+']')
s.add(23925 * flag[0] == 2440350)
s.add(281400 * flag[1] - 7037 * flag[0] == 29673426)
s.add(174826 * flag[0] - 255300 * flag[2] - 283573 * flag[1] == -37557732)
s.add(259881 * flag[2] + -98445 * flag[1] - 276718 * flag[0] + 4524 * flag[3] == -13182867)
s.add(285576 * flag[2] + -274569 * flag[3] + 94721 * flag[0] - 228216 * flag[4] - 60353 * flag[1] == -25506885)
s.add(260927 * flag[3] + -5496 * flag[1] + -294195 * flag[4] + 264844 * flag[2] + 125853 * flag[5] - 153661 * flag[0] == 13075233)
s.add(17630 * flag[0] + -258397 * flag[3] + -244952 * flag[1] + -244086 * flag[2] + -130259 * flag[5] - 190371 * flag[6] - 109961 * flag[4] == -111027477)
s.add(117817 * flag[5] + 268397 * flag[7] + -198175 * flag[1] + 18513 * flag[2] + 218992 * flag[6] + -6727 * flag[3] + 228408 * flag[0] + 224658 * flag[4] == 78775012)
s.add(-288418 * flag[3] + -218493 * flag[7] + -236774 * flag[0] + 77982 * flag[2] + 190784 * flag[4] + -84462 * flag[1] + 92684 * flag[8] + 52068 * flag[5] - 243023 * flag[6] == -52520267)
s.add(-196269 * flag[8] + -64473 * flag[7] + -142792 * flag[5] + 171321 * flag[4] + -39259 * flag[9] + -269632 * flag[2] + 229049 * flag[6] + 96631 * flag[3] - 280754 * flag[1] - 168397 * flag[0] == -70797046)
s.add(-235026 * flag[4] + 162669 * flag[8] + -256202 * flag[1] + -32946 * flag[9] + -25900 * flag[2] + 195039 * flag[10] + 182157 * flag[3] + 292706 * flag[0] + -93524 * flag[5] + 121516 * flag[6] + 165207 * flag[7] == 28263339)
s.add(-131770 * flag[6] + -92964 * flag[9] + -111160 * flag[8] + -258188 * flag[7] + 133728 * flag[1] + -272650 * flag[5] + -4940 * flag[10] + 272791 * flag[3] + 80519 * flag[2] + -165434 * flag[11] + 50166 * flag[0] + 148713 * flag[4] == -22025185)
s.add(-262820 * flag[4] + 9710 * flag[10] + 71182 * flag[12] + -184125 * flag[1] + -100280 * flag[6] + 62018 * flag[11] + 141532 * flag[9] + -138253 * flag[8] + 20489 * flag[0] + -214348 * flag[2] + 162962 * flag[3] - 93199 * flag[7] + 147171 * flag[5] == -31396844)
s.add(-55254 * flag[8] + 220404 * flag[12] + -86956 * flag[10] + -200702 * flag[5] + -51437 * flag[1] + 25739 * flag[6] + 122945 * flag[3] + 116256 * flag[7] + 22859 * flag[4] + -61880 * flag[9] + -119275 * flag[2] + -224754 * flag[13] - 75412 * flag[0] + 59999 * flag[11] == -37063008)
s.add(111310 * flag[0] + 198502 * flag[3] + -189890 * flag[13] + 278745 * flag[5] + 157462 * flag[9] + 135809 * flag[4] + -2621 * flag[2] + 67553 * flag[6] + 144834 * flag[1] + -88326 * flag[11] + -228149 * flag[10] + 233663 * flag[14] + -249960 * flag[12] + 300012 * flag[8] + 91783 * flag[7] == 93457153)
s.add(15897 * flag[0] + -11943 * flag[13] + 194067 * flag[3] + 125666 * flag[2] + 104421 * flag[12] + -181764 * flag[5] + -233813 * flag[8] + -235783 * flag[4] + 230636 * flag[11] + 148005 * flag[6] + -48167 * flag[14] + -163572 * flag[9] + 54553 * flag[10] + -129997 * flag[1] + 114175 * flag[7] - 251681 * flag[15] == -36640750)
s.add(-90549 * flag[3] + -228520 * flag[14] + 34835 * flag[10] + -203538 * flag[15] + 272318 * flag[13] + -68478 * flag[8] + 22454 * flag[9] + 74128 * flag[12] + 70051 * flag[6] + -289940 * flag[7] + -52501 * flag[5] + -1254 * flag[4] + 154844 * flag[11] + 254969 * flag[2] + -39495 * flag[1] + 277429 * flag[16] - 132752 * flag[0] == -6628237)
s.add(128092 * flag[11] + -5873 * flag[17] + -144172 * flag[3] + -148216 * flag[13] + 189050 * flag[2] + 66107 * flag[5] + 237987 * flag[0] + -53271 * flag[9] + -86968 * flag[12] + -94616 * flag[10] + -247882 * flag[8] + -5107 * flag[1] + 55085 * flag[15] + 10792 * flag[14] + -112241 * flag[4] + -36680 * flag[16] - 210718 * flag[7] - 249539 * flag[6] == -53084017)
s.add(-186088 * flag[2] + 19517 * flag[13] + -65515 * flag[5] + 195447 * flag[1] + 145470 * flag[14] + 58825 * flag[16] + 272227 * flag[15] + -155443 * flag[8] + 100397 * flag[3] + -238861 * flag[18] + 84628 * flag[7] + 1337 * flag[17] + 156976 * flag[12] + -74209 * flag[4] + 175077 * flag[11] + 134548 * flag[0] + -280672 * flag[6] + 12264 * flag[10] + 56937 * flag[9] == 60764977)
s.add(-58873 * flag[7] + -283834 * flag[9] + 159144 * flag[13] + -199631 * flag[0] + 54404 * flag[16] + -190345 * flag[8] + 176103 * flag[3] + 137206 * flag[17] + -170051 * flag[6] + 281718 * flag[11] + 137214 * flag[14] + -104395 * flag[19] + -122090 * flag[4] + 162065 * flag[15] + -36580 * flag[18] + 245858 * flag[12] + -18520 * flag[10] + -138274 * flag[1] + 139185 * flag[2] - 197535 * flag[5] == 4912728)
s.add(293345 * flag[9] + 63329 * flag[13] + 74470 * flag[8] + -72984 * flag[11] + -162393 * flag[20] + 150036 * flag[15] + 127913 * flag[19] + 181147 * flag[16] + 27751 * flag[6] + -239133 * flag[1] + -28337 * flag[17] + 108149 * flag[0] + 148338 * flag[2] + 38137 * flag[18] + -199427 * flag[14] + -97284 * flag[4] + -39775 * flag[3] + -109205 * flag[10] + 270604 * flag[5] - 193384 * flag[12] + 168963 * flag[7] == 45577809)
s.add(45637 * flag[6] + 111858 * flag[17] + 244009 * flag[19] + -188979 * flag[8] + -220539 * flag[16] + 246135 * flag[2] + -174651 * flag[14] + 179514 * flag[4] + 153071 * flag[15] + -207716 * flag[21] + 64641 * flag[7] + 293781 * flag[12] + 263208 * flag[10] + 44675 * flag[1] + 131692 * flag[3] + 109605 * flag[11] + 293201 * flag[5] + -98937 * flag[9] + 60492 * flag[20] + -273571 * flag[13] - 38942 * flag[0] - 285946 * flag[18] == 77539017)
s.add(-160726 * flag[9] + 234971 * flag[18] + 32897 * flag[4] + -206184 * flag[11] + -86224 * flag[20] + 92896 * flag[22] + 295735 * flag[15] + -58530 * flag[0] + -197632 * flag[13] + -21957 * flag[17] + -43684 * flag[6] + -141434 * flag[10] + -194890 * flag[1] + -148390 * flag[21] + 105293 * flag[14] + 76213 * flag[3] + 9791 * flag[12] + -258754 * flag[8] + 59119 * flag[16] + 255675 * flag[2] + -130852 * flag[7] - 71444 * flag[5] + 127285 * flag[19] == -38197685)
s.add(205675 * flag[20] + 197685 * flag[1] + 144870 * flag[4] + 120347 * flag[10] + 202621 * flag[14] + -236806 * flag[17] + 268813 * flag[3] + 191822 * flag[23] + -40848 * flag[6] + 103466 * flag[7] + -211930 * flag[5] + -180522 * flag[19] + -188959 * flag[15] + -238839 * flag[21] + 281705 * flag[11] + 175825 * flag[16] + -44618 * flag[12] + 196370 * flag[0] + 89330 * flag[22] + -133696 * flag[8] + -60213 * flag[2] + 191404 * flag[18] - 291063 * flag[9] + 13902 * flag[13] == 67763764)
s.add(69341 * flag[15] + -19740 * flag[21] + 62004 * flag[10] + 29334 * flag[8] + -78459 * flag[1] + -261617 * flag[3] + 115716 * flag[22] + 7838 * flag[16] + -173902 * flag[14] + 115189 * flag[9] + 234832 * flag[7] + -54321 * flag[5] + -268221 * flag[20] + -210563 * flag[18] + -161113 * flag[13] + -199130 * flag[23] + -94067 * flag[24] + 9601 * flag[11] + -8509 * flag[12] + 14439 * flag[2] + -243227 * flag[19] + 37665 * flag[17] + 91076 * flag[6] - 85246 * flag[0] + 39558 * flag[4] == -98330271)
s.add(38468 * flag[19] + -75568 * flag[2] + 169299 * flag[22] + -252915 * flag[3] + 32044 * flag[24] + -260264 * flag[8] + -111200 * flag[1] + -78437 * flag[20] + -212633 * flag[16] + 180400 * flag[5] + -81477 * flag[12] + 232645 * flag[0] + -65268 * flag[4] + 263000 * flag[6] + 247654 * flag[25] + -242059 * flag[17] + -35931 * flag[9] + -271816 * flag[21] + 10191 * flag[13] + 41768 * flag[23] + 92844 * flag[7] + -73366 * flag[14] + -124307 * flag[10] + 197710 * flag[18] + 226192 * flag[15] + 3788 * flag[11] == -13464859)
s.add(-23897 * flag[9] + -188087 * flag[24] + -254282 * flag[15] + -102361 * flag[23] + -15606 * flag[14] + -74795 * flag[21] + 116581 * flag[12] + 77693 * flag[5] + -6866 * flag[25] + 215574 * flag[22] + 231326 * flag[6] + 77915 * flag[2] + 186585 * flag[3] + 219151 * flag[4] + 271210 * flag[13] + -78913 * flag[20] + 83918 * flag[8] + -153409 * flag[18] + -84952 * flag[7] + -121854 * flag[0] + -253617 * flag[26] + -213665 * flag[19] + -293146 * flag[17] + -166693 * flag[16] + -206964 * flag[1] - 155664 * flag[10] + 180598 * flag[11] == -55504393)
s.add(264405 * flag[11] + 135302 * flag[12] + 278196 * flag[9] + -132906 * flag[23] + 138308 * flag[7] + 40423 * flag[21] + 157781 * flag[0] + -38949 * flag[27] + -143324 * flag[14] + -120743 * flag[10] + 77375 * flag[5] + -164339 * flag[3] + 167370 * flag[25] + -225830 * flag[4] + -136952 * flag[2] + -14347 * flag[8] + 6966 * flag[26] + 88628 * flag[18] + 138998 * flag[22] + 147747 * flag[19] + -106792 * flag[6] + -113009 * flag[20] + 98136 * flag[15] + 231264 * flag[24] + -109447 * flag[17] + 258890 * flag[1] + 167885 * flag[16] + 246315 * flag[13] == 133068723 )
print(s.check())
answer=s.model()
print(answer)
# answer提取出来
a = [125, 102, 98, 48, 95, 116, 110, 51, 109, 103, 101, 53, 95, 120, 120, 95, 107, 99, 117, 70, 95, 48, 103, 123, 103, 97, 108, 102]
a.reverse()
a = [chr(i) for i in a]
print("".join(a))
# flag{g0_Fuck_xx_5egm3nt_0bf}
红方辅助
这个题虽然不是逆向题,但是感觉跟逆向题中的VM差不多
分析程序
分析流量包
发现数据相当有规律
最终发现
47 -->G
9b 3e 37 5f <----btime
ff ff ef 00 ---->offset
00 00 00 00 ----->count
84 00 00 00 ---->datasize + 10
30 ----->fn
0e ----->salt
a4 02 5b 62 a4 02 ------>enc_data
5b 62 a4 02 5b 62 a4 02 5b 62 a4 02 5b 62 a4 02
5b 62 a4 02 5b 62 a4 02 5b 62 a4 02 5b 62 a4 02
5b 62 a4 02 5b 62 a4 02 5b 62 a4 02 5b 62 a4 02
5b 62 a4 02 5b 62 a4 02 5b 62 a4 02 5b 62 a4 02
5b 62 a4 02 5b 62 a4 02 5b 62 a4 02 5b 62 a4 02
5b 62 a4 02 5b 62 a4 02 5b 62 a4 02 5b 62 a4 02 [b..[b.. [b..[b..
5b 62 a4 26
01 00 00 00 < ----- count + 1
然后将这段数据2进制保存下来,
根据这段逆向写脚本即可
import random
from hashlib import md5, sha256
import struct
# 一共414组
data_all = []
i = 0
with open("data", "rb") as f:
while i < 414:
c = f.read(1) # 读取G
time_stamp = struct.unpack("<i", f.read(4))[0] # 时间戳
offset = struct.unpack("<i", f.read(4))[0] # 偏移
# 得到前面的代号
count1 = struct.unpack("<i", f.read(4))[0] # 前count
if count1 > 1000:
count1 = struct.unpack("<i", f.read(4))[0]
# 得到大小
data_num = struct.unpack("<i", f.read(4))[0] - 10
fn = f.read(1).decode()
salt = f.read(1)[0]
data_content = f.read(data_num)
# 得到后面的代号
count2 = struct.unpack("<i", f.read(4))[0]
if (count1 + 1) == count2:
print(count1)
data_all.append([time_stamp, offset, count1, data_num, fn, salt, data_content])
i = i + 1
# 得到所有的列表
print(data_all)
# data_all.append([time_stamp, offset, count1, data_num, fn, salt, data_content])
# 0时间戳, 1偏移,2count,3数据大小,4fn,5salt,6数据详细内容
# x:data y:salt z:t[i]
funcs = {
"0": lambda x, y, z: ((x + y) ^ z) & 0XFF,
"1": lambda x, y, z: ((x - y) ^ z) & 0XFF,
"2": lambda x, y, z: (x ^ y ^ z) & 0XFF
}
data_flag = []
for datas in data_all:
data_content_tmp = datas[6]
t = struct.pack("<i", (datas[0] - datas[1])) # 时间戳 - 偏移
i = 0
tmp_flag = ""
for c in data_content_tmp:
tmp_flag += chr(funcs[datas[4]](c, datas[5], t[i]))
i = (i + 1) % 4
data_flag.append(tmp_flag)
with open("flag.txt", "w") as f:
for i in data_flag:
f.writelines(i)
在notepad ++中打开flag.txt,得到flag
这三道题目的链接:https://wwe.lanzouj.com/b015pvcoj
密码:7blu