xx_warmup_obf-强网杯

强网杯的逆向题,当时也没做出来。
拿到题,反编译不了,搜字符串,找到关键部分,F5不了,而且数据夹杂着代码,像是通过分发器和跳转指令来运行这片代码。
动调遇到int3,而“pass to app",就会进死循环。这就很诡异了,本身程序自身的代码出现int3指令程序一卡一卡的还能执行吗。在sub_400B4C里,注册了信号量处理函数,当没有调试器附加的时候,执行int3指令,会有信号量发送给这个处理函数,处理函数会更改分发,从而不进入死循环。所以进入死循环,就改条件跳出来,然后接着调试。一路下来会来到0x402D05,这个位置是算法开始,发现接下来都是相同的算法结构。
看懂程序后就是要想办法吧数据dump出来,因为不能出伪代码,直接从两千多条指令中扣28个方程难度实在是太大,我就先用IDA trace得到所有命令,然后脚本清洗。

#parser.py
with open("trace.txt") as fp:
    l = fp.readlines()
new_bj = 0
pos = 0
equation = ""
for i in l:
    if(i == "mov     rax, [rbp-8]\n"):
        new_bj = 1
    if i.startswith("add     rax,") and new_bj == 1:
        pos = eval( "0x" + i[i.find(',')+2:].rstrip('h\n'))
        new_bj = 0
    if i.startswith("imul"):
        val = eval( "0x" + i[i.find('eax,')+5:].rstrip('h\n'))
        if val & 0x80000000 != 0:
            val=val^0xffffffff
            val=val+1
            val = -val
        equation += "flag[{}]".format(pos) + "*" + str(val) + " + "
        pos = 0
    if i.startswith("cmp     eax,"):
        val = eval( "0x" + i[i.find('eax,')+5:].rstrip('h\n'))
        if val & 0x80000000 != 0:
            val=val^0xffffffff
            val=val+1
            val = -val
        equation += " == " + str(val)
        equation = "solver.add( (" + equation.replace("+  ==",") ==") + ")"
        print(equation)
        new_bj = 0
        pos = 0
        equation = ""

解析出28个方程,直接上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}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值