吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 15369|回复: 85
收起左侧

[CTF] 2020强网杯部分题WP

  [复制链接]
zsky 发表于 2020-8-24 15:58
本帖最后由 L15263458908 于 2020-11-7 14:50 编辑

侧防

IDA打开程序
A761037A-3EAF-4629-BA1D-AABE8B7FD2FF.png

3CE3AA35-A774-496A-AA6F-12DF23AC8FCA.png

写脚本逆向即可

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函数里发现有大量的赋值,并注册了异常处理函数
756CC877-4D89-40BB-B803-7C3453AFFA25.png
调试起来,将handler还原,发现跟flag的判断并没有关系(这里是配合混淆的。)
AC0A52DD-4CD0-4089-9F65-50B496D338E6.png
这里说一下,最初在调试的时候遇到int 3 IDA就截获了这个信号,并没有把他传给程序
打开IDA调试器选项
71A1552F-CCC1-4583-882B-DD23E16367B8.png
这样设置,可以将信号传给程序,以便于调试
D6B96A0C-1261-431D-8F7F-3F209A02A63C.png

进入main函数,发现有大量的混淆
比如这里,每次运行到类似于这种地方的跳转,每一次都是固定的,其实不用管它,一步步跟,直到处理flag的函数那里
最终发现402968是处理flag 的函数

A05ECC59-96FF-4493-8A8A-448CA5865429.png

将没用的代码全部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
F6B30874-07EA-4446-B5B1-294F821D99E1.png
74F4B730-A43C-4646-9CBA-EC74A395755F.png

进入图形界面,修改完毕
397C3FC0-CAA0-4BEA-8CCE-85C9DA2B6FEE.png
然后F5
EF36F03E-6A4C-4673-A814-F548C22D5C83.png
发现程序是个方程,将方程提取出来,然后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差不多

分析程序
736969BF-0542-49BD-AF66-3AAA6AD8C5BA.png

分析流量包
26948472-AF68-4954-B429-5A32698F9024.png
发现数据相当有规律
最终发现

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进制保存下来,
8DDC31EB-DFA8-47CE-9FF7-02F2F46511A5.png
根据这段逆向写脚本即可

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

D57C0BAE-65B6-4447-B78E-7859A435CBF8.png


这三道题目的链接:https://wwe.lanzouj.com/b015pvcoj
密码:7blu

免费评分

参与人数 36吾爱币 +30 热心值 +31 收起 理由
bruce_yyb + 1 我很赞同!
yuchi22 + 1 我很赞同!
什么之空 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
感觉风 + 1 用心讨论,共获提升!
Maise + 1 谢谢@Thanks!
2858282027 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
万一赢了呢 + 1 + 1 用心讨论,共获提升!
CKJo + 1 + 1 用心讨论,共获提升!
alderaan + 1 + 1 热心回复!
bitpeach + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
ae_86_110 + 1 + 1 我很赞同!
woshima + 1 + 1 用心讨论,共获提升!
MUMUAA + 1 + 1 感谢您的宝贵建议,我们会努力争取做得更好!
fengbolee + 1 + 1 用心讨论,共获提升!
sym945 + 1 + 1 热心回复!
liuhai123 + 1 + 1 我很赞同!
BrainFlower + 1 + 1 热心回复!
zsq + 1 + 1 谢谢@Thanks!
独行风云 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
我忘多 + 1 用心讨论,共获提升!
咖啡不加糖123 + 1 + 1 感谢您的宝贵建议,我们会努力争取做得更好!
刘天子 + 1 + 1 看不懂但是好像很厉害的样子
wuliwuli + 1 我很赞同!
silence2540 + 1 + 1 我很赞同!
chen_null + 1 用心讨论,共获提升!
whitewin + 1 用心讨论,共获提升!
sunnylds7 + 1 + 1 热心回复!
香烟烈酒无睡意 + 1 + 1 热心回复!
__不说 + 1 + 1 谢谢@Thanks!
AlanSilence + 1 + 1 谢谢@Thanks!
植元枫 + 1 + 1 我很赞同!
love105827 + 1 曾经就是这些分析看的热血澎湃
7ixia + 1 谢谢@Thanks!
笙若 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
不懂就问小小白 + 1 + 1 用心讨论,共获提升!
Hotspur + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

瑟瑟发抖小菜虾 发表于 2020-8-26 10:05
why1sme 发表于 2020-8-25 21:12
学习了! PS: 今年强网杯还有一道flower题目,是一个apk,有大佬尝试过么,求教如何动态调试

那个题目我也没有动态调试成功,但是静态修复的话能做出来...不知道是不是用了黑科技,这里蹲一手~~~
judgecx 发表于 2020-8-25 11:21
AllWillNull 发表于 2020-8-24 16:00
大陆小伙操港婊 发表于 2020-8-24 16:09
好久没来了,露个脸
52chunchun 发表于 2020-8-24 16:11
专业!!!!!!
tangming123 发表于 2020-8-24 16:18
看不懂,直接点赞就行了
haoxuer 发表于 2020-8-24 16:22
大学学过语言,现在都还给老师了,感谢分享
Antony丶 发表于 2020-8-24 16:53
我就是一脸懵逼的,看看。。。
XiM0 发表于 2020-8-24 17:15
膜拜大哥,嘤嘤嘤,逆向就做出来z3一把梭的
未央i 发表于 2020-8-24 18:08
这么强的吗
不懂就问小小白 发表于 2020-8-24 18:28
感谢大佬的分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 10:04

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表