2020-09-15

强网杯2020 xx_warmup_obf 复现

由于技术问题,看了很多篇博客才勉勉强强把这题大体上复现了出来。

  1. 远程调试,跟踪流程
    以前很少使用ida的远程调试,一般都是用gdb,但是这次用gdb调试的话完全看不出来哪一些判断该改哪一些判断不该改,大量的混淆搞得晕头转向(也是第一 次接触int3,不是很懂,那些SIGTRAP,SIGALRM什么的)。
    进来以后断点下在比较或者输入那里(可以通过strlen/read函数的引用来查找到相应位置)
    输入之后一步一步跟到flag的比较的地方(0x402968)
  2. ida patch

如下图,就是一些混淆的代码
在这里插入图片描述
然后单步跟发现0x402D05是开始对flag进行验证,所以可以把上图的地址一直到这里中间都可以nop掉。
在这里插入图片描述

还有类似这些,也可以nop掉(就是jnz后面一直到jz的地址,如这里就是START=0x402D2F,END=0x402F65)
在这里插入图片描述
在这里插入图片描述
然后nop完最后一块,可以先选中函数P一下,然后再F5,如果堆栈不平衡的话改一下就可以的了
在这里插入图片描述

3.最后f5出来的结果如下(emmm不是很干净,那些JUMPOUT……)
得到了28个方程式

在这里插入图片描述
然后复制用编辑器改一下格式,最后出来的z3解密脚本如下:

from z3 import *
flag = [Int('flag%d' % i) for i in range(28)]
flagg=""
s = Solver()
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)
s.check()#print(s.check())
model = s.model()
res = [model[flag[i]].as_long() for i in range(28)]
for i in res:
    flagg+=chr(i)
print(flagg)

跑出来的flag:flag{g0_Fuck_xx_5egm3nt_0bf}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值