強(qiáng)網(wǎng)杯2020-部分re

wtclwtclwtcl拖后腿一級(jí)選手哭

xx_warmup_obf

加了混淆不能直接f5古拴,但是很容易能找到各種乘法和比較的區(qū)域苗桂,猜測(cè)是check的代碼,算出第一個(gè)字符是f,所以就是解方程躁锡。匯編手抄有點(diǎn)麻煩,可以將每個(gè)jz指令和jz的目的地址之間的代碼直接nop置侍,這樣就能f5了映之,復(fù)制出來(lái)稍微修改一下即可拦焚。

from z3 import *

solver = Solver()

s = [Int('s%i' % i) for i in range(0x1c)]
solver.add(23925 * s[0] == 2440350 )
solver.add(281400 * s[1] - 7037 * s[0] == 29673426 )
solver.add(174826 * s[0] - 255300 * s[2] - 283573 * s[1] == -37557732 )
solver.add(259881 * s[2] + -98445 * s[1] - 276718 * s[0] + 4524 * s[3] == -13182867 )
solver.add(285576 * s[2]
+ -274569 * s[3]
+ 94721 * s[0]
- 228216 * s[4]
- 60353 * s[1] == -25506885 )
solver.add(260927 * s[3]
+ -5496 * s[1]
+ -294195 * s[4]
+ 264844 * s[2]
+ 125853 * s[5]
- 153661 * s[0] == 13075233 )
solver.add(17630 * s[0]
+ -258397 * s[3]
+ -244952 * s[1]
+ -244086 * s[2]
+ -130259 * s[5]
- 190371 * s[6]
- 109961 * s[4] == -111027477 )
solver.add(117817 * s[5]
+ 268397 * s[7]
+ -198175 * s[1]
+ 18513 * s[2]
+ 218992 * s[6]
+ -6727 * s[3]
+ 228408 * s[0]
+ 224658 * s[4] == 78775012 )
solver.add(-288418 * s[3]
+ -218493 * s[7]
+ -236774 * s[0]
+ 77982 * s[2]
+ 190784 * s[4]
+ -84462 * s[1]
+ 92684 * s[8]
+ 52068 * s[5]
- 243023 * s[6] == -52520267 )
solver.add(-196269 * s[8]
+ -64473 * s[7]
+ -142792 * s[5]
+ 171321 * s[4]
+ -39259 * s[9]
+ -269632 * s[2]
+ 229049 * s[6]
+ 96631 * s[3]
- 280754 * s[1]
- 168397 * s[0] == -70797046 )
solver.add(-235026 * s[4]
+ 162669 * s[8]
+ -256202 * s[1]
+ -32946 * s[9]
+ -25900 * s[2]
+ 195039 * s[10]
+ 182157 * s[3]
+ 292706 * s[0]
+ -93524 * s[5]
+ 121516 * s[6]
+ 165207 * s[7] == 28263339 )
solver.add(-131770 * s[6]
+ -92964 * s[9]
+ -111160 * s[8]
+ -258188 * s[7]
+ 133728 * s[1]
+ -272650 * s[5]
+ -4940 * s[10]
+ 272791 * s[3]
+ 80519 * s[2]
+ -165434 * s[11]
+ 50166 * s[0]
+ 148713 * s[4] == -22025185 )
solver.add(-262820 * s[4]
+ 9710 * s[10]
+ 71182 * s[12]
+ -184125 * s[1]
+ -100280 * s[6]
+ 62018 * s[11]
+ 141532 * s[9]
+ -138253 * s[8]
+ 20489 * s[0]
+ -214348 * s[2]
+ 162962 * s[3]
- 93199 * s[7]
+ 147171 * s[5] == -31396844 )
solver.add(-55254 * s[8]
+ 220404 * s[12]
+ -86956 * s[10]
+ -200702 * s[5]
+ -51437 * s[1]
+ 25739 * s[6]
+ 122945 * s[3]
+ 116256 * s[7]
+ 22859 * s[4]
+ -61880 * s[9]
+ -119275 * s[2]
+ -224754 * s[13]
- 75412 * s[0]
+ 59999 * s[11] == -37063008 )
solver.add(111310 * s[0]
+ 198502 * s[3]
+ -189890 * s[13]
+ 278745 * s[5]
+ 157462 * s[9]
+ 135809 * s[4]
+ -2621 * s[2]
+ 67553 * s[6]
+ 144834 * s[1]
+ -88326 * s[11]
+ -228149 * s[10]
+ 233663 * s[14]
+ -249960 * s[12]
+ 300012 * s[8]
+ 91783 * s[7] == 93457153 )
solver.add(15897 * s[0]
+ -11943 * s[13]
+ 194067 * s[3]
+ 125666 * s[2]
+ 104421 * s[12]
+ -181764 * s[5]
+ -233813 * s[8]
+ -235783 * s[4]
+ 230636 * s[11]
+ 148005 * s[6]
+ -48167 * s[14]
+ -163572 * s[9]
+ 54553 * s[10]
+ -129997 * s[1]
+ 114175 * s[7]
- 251681 * s[15] == -36640750 )
solver.add(-90549 * s[3]
+ -228520 * s[14]
+ 34835 * s[10]
+ -203538 * s[15]
+ 272318 * s[13]
+ -68478 * s[8]
+ 22454 * s[9]
+ 74128 * s[12]
+ 70051 * s[6]
+ -289940 * s[7]
+ -52501 * s[5]
+ -1254 * s[4]
+ 154844 * s[11]
+ 254969 * s[2]
+ -39495 * s[1]
+ 277429 * s[16]
- 132752 * s[0] == -6628237 )
solver.add(128092 * s[11]
+ -5873 * s[17]
+ -144172 * s[3]
+ -148216 * s[13]
+ 189050 * s[2]
+ 66107 * s[5]
+ 237987 * s[0]
+ -53271 * s[9]
+ -86968 * s[12]
+ -94616 * s[10]
+ -247882 * s[8]
+ -5107 * s[1]
+ 55085 * s[15]
+ 10792 * s[14]
+ -112241 * s[4]
+ -36680 * s[16]
- 210718 * s[7]
- 249539 * s[6] == -53084017 )
solver.add(-186088 * s[2]
+ 19517 * s[13]
+ -65515 * s[5]
+ 195447 * s[1]
+ 145470 * s[14]
+ 58825 * s[16]
+ 272227 * s[15]
+ -155443 * s[8]
+ 100397 * s[3]
+ -238861 * s[18]
+ 84628 * s[7]
+ 1337 * s[17]
+ 156976 * s[12]
+ -74209 * s[4]
+ 175077 * s[11]
+ 134548 * s[0]
+ -280672 * s[6]
+ 12264 * s[10] + 56937 * s[9] == 60764977 )
solver.add(-58873 * s[7] + -283834 * s[9]
+ 159144 * s[13]
+ -199631 * s[0]
+ 54404 * s[16]
+ -190345 * s[8]
+ 176103 * s[3]
+ 137206 * s[17]
+ -170051 * s[6]
+ 281718 * s[11]
+ 137214 * s[14]
+ -104395 * s[19]
+ -122090 * s[4]
+ 162065 * s[15]
+ -36580 * s[18]
+ 245858 * s[12]
+ -18520 * s[10]
+ -138274 * s[1]
+ 139185 * s[2] - 197535 * s[5] == 4912728 )
solver.add(293345 * s[9] + 63329 * s[13] + 74470 * s[8]
+ -72984 * s[11]
+ -162393 * s[20]
+ 150036 * s[15]
+ 127913 * s[19]
+ 181147 * s[16]
+ 27751 * s[6]
+ -239133 * s[1]
+ -28337 * s[17]
+ 108149 * s[0]
+ 148338 * s[2]
+ 38137 * s[18]
+ -199427 * s[14]
+ -97284 * s[4]
+ -39775 * s[3]
+ -109205 * s[10]
+ 270604 * s[5]
- 193384 * s[12] + 168963 * s[7] == 45577809 )
solver.add(45637 * s[6]
+ 111858 * s[17]
+ 244009 * s[19]
+ -188979 * s[8]
+ -220539 * s[16]
+ 246135 * s[2]
+ -174651 * s[14]
+ 179514 * s[4]
+ 153071 * s[15]
+ -207716 * s[21]
+ 64641 * s[7]
+ 293781 * s[12]
+ 263208 * s[10]
+ 44675 * s[1]
+ 131692 * s[3]
+ 109605 * s[11]
+ 293201 * s[5]
+ -98937 * s[9]
+ 60492 * s[20]
+ -273571 * s[13]
- 38942 * s[0]
- 285946 * s[18] == 77539017 )
solver.add(-160726 * s[9]
+ 234971 * s[18]
+ 32897 * s[4]
+ -206184 * s[11]
+ -86224 * s[20]
+ 92896 * s[22]
+ 295735 * s[15]
+ -58530 * s[0]
+ -197632 * s[13]
+ -21957 * s[17]
+ -43684 * s[6]
+ -141434 * s[10]
+ -194890 * s[1]
+ -148390 * s[21]
+ 105293 * s[14]
+ 76213 * s[3]
+ 9791 * s[12]
+ -258754 * s[8]
+ 59119 * s[16]
+ 255675 * s[2]
+ -130852 * s[7]
- 71444 * s[5]
+ 127285 * s[19] == -38197685 )
solver.add(205675 * s[20]
+ 197685 * s[1]
+ 144870 * s[4]
+ 120347 * s[10]
+ 202621 * s[14]
+ -236806 * s[17]
+ 268813 * s[3]
+ 191822 * s[23]
+ -40848 * s[6]
+ 103466 * s[7]
+ -211930 * s[5]
+ -180522 * s[19]
+ -188959 * s[15]
+ -238839 * s[21]
+ 281705 * s[11]
+ 175825 * s[16]
+ -44618 * s[12]
+ 196370 * s[0]
+ 89330 * s[22]
+ -133696 * s[8]
+ -60213 * s[2]
+ 191404 * s[18]
- 291063 * s[9]
+ 13902 * s[13] == 67763764 )
solver.add(69341 * s[15]
+ -19740 * s[21]
+ 62004 * s[10]
+ 29334 * s[8]
+ -78459 * s[1]
+ -261617 * s[3]
+ 115716 * s[22]
+ 7838 * s[16]
+ -173902 * s[14]
+ 115189 * s[9]
+ 234832 * s[7]
+ -54321 * s[5]
+ -268221 * s[20]
+ -210563 * s[18]
+ -161113 * s[13]
+ -199130 * s[23]
+ -94067 * s[24]
+ 9601 * s[11]
+ -8509 * s[12]
+ 14439 * s[2]
+ -243227 * s[19]
+ 37665 * s[17]
+ 91076 * s[6]
- 85246 * s[0]
+ 39558 * s[4] == -98330271 )
solver.add(38468 * s[19]
+ -75568 * s[2]
+ 169299 * s[22]
+ -252915 * s[3]
+ 32044 * s[24]
+ -260264 * s[8]
+ -111200 * s[1]
+ -78437 * s[20]
+ -212633 * s[16]
+ 180400 * s[5]
+ -81477 * s[12]
+ 232645 * s[0]
+ -65268 * s[4]
+ 263000 * s[6]
+ 247654 * s[25]
+ -242059 * s[17]
+ -35931 * s[9]
+ -271816 * s[21]
+ 10191 * s[13]
+ 41768 * s[23]
+ 92844 * s[7]
+ -73366 * s[14]
+ -124307 * s[10]
+ 197710 * s[18]
+ 226192 * s[15]
+ 3788 * s[11] == -13464859 )
solver.add(-23897 * s[9]
+ -188087 * s[24]
+ -254282 * s[15]
+ -102361 * s[23]
+ -15606 * s[14]
+ -74795 * s[21]
+ 116581 * s[12]
+ 77693 * s[5]
+ -6866 * s[25]
+ 215574 * s[22]
+ 231326 * s[6]
+ 77915 * s[2]
+ 186585 * s[3]
+ 219151 * s[4]
+ 271210 * s[13]
+ -78913 * s[20]
+ 83918 * s[8]
+ -153409 * s[18]
+ -84952 * s[7]
+ -121854 * s[0]
+ -253617 * s[26]
+ -213665 * s[19]
+ -293146 * s[17]
+ -166693 * s[16]
+ -206964 * s[1]
- 155664 * s[10]
+ 180598 * s[11] == -55504393 )
solver.add(264405 * s[11]
+ 135302 * s[12]
+ 278196 * s[9]
+ -132906 * s[23]
+ 138308 * s[7]
+ 40423 * s[21]
+ 157781 * s[0]
+ -38949 * s[27]
+ -143324 * s[14]
+ -120743 * s[10]
+ 77375 * s[5]
+ -164339 * s[3]
+ 167370 * s[25]
+ -225830 * s[4]
+ -136952 * s[2]
+ -14347 * s[8]
+ 6966 * s[26]
+ 88628 * s[18]
+ 138998 * s[22]
+ 147747 * s[19]
+ -106792 * s[6]
+ -113009 * s[20]
+ 98136 * s[15]
+ 231264 * s[24]
+ -109447 * s[17]
+ 258890 * s[1]
+ 167885 * s[16]
+ 246315 * s[13] == 133068723 )
print(solver.check())
res = solver.model()
flag = ""
for a in s:
    flag = flag + chr(int(str(res[a])))
print(flag) 

imitation_game

first part:
AES加密,CBC模式

# -*- coding:utf-8 -*-
from Crypto.Cipher import AES
import binascii
def padding(s,n):
    len1 = len(s)
    n1 = len1 % n
    s += chr(0x1a)*(49-n1)
    s += chr(0)*(0x40-len(s))
    return s

def de_aes_cbc(s,k):
    if len(s) % 16 != 0:
        s = padding(s,16)
    key = k
    iv = " !\"#$%&'()*+,-./"
    ci = AES.new(key,AES.MODE_CBC,iv)
    return ci.decrypt(s)

def en_aes_cbc(s,k):
    s = padding(s,0x40)
    key = k
    iv = " !\"#$%&'()*+,-./"
    print(len(k), len(iv))
    ci = AES.new(key,AES.MODE_CBC,iv)
    return ci.encrypt(s)

target = [0x9D, 0x7B, 0xA2, 0x3C, 0xB1, 0x09, 0x9A, 0x48, 0x41, 0xD1, 0x66, 0x63, 0xD6, 0xAE, 0x3C, 0xAB, 0x1F, 0x44, 0x0E, 0x33, 0xFB, 0xB5, 0xB8, 0xA9, 0x02, 0x65, 0x83, 0xD9, 0x47, 0x30, 0x6D, 0x24, 0xB0, 0x75, 0x79, 0xD5, 0xCC, 0x80, 0x0E, 0x67, 0x11, 0x62, 0x4C, 0xF1, 0xF5, 0xAF, 0x9E, 0x69, 0x93, 0x69, 0x7C, 0x48, 0xAD, 0xD3, 0x45, 0x29, 0x68, 0xBA, 0xED, 0x9A, 0x70, 0xA0, 0xD1, 0x0D]
strs = "".join(chr(i) for i in target)
print(de_aes_cbc(strs,"\x3E\x2C\x25\x13\x18\xBE\xC3\x6B\xA1\x37\x24\x53\x03\x1E\x51\xEC").rstrip(chr(0x1a)))
# 6c8f1d78770fe672122478c6f9a150e0

second part:
https://github.com/mattmikolay/chip-8/wiki/CHIP%E2%80%908-Instruction-Set
https://www.anquanke.com/post/id/172217#h3-6
https://github.com/cj1128/chip8-emulator
后半段啟動(dòng)了一個(gè)chip-8模擬器杠输,加載game.bin運(yùn)行一個(gè)游戲赎败。輸入10個(gè)16進(jìn)制數(shù)進(jìn)行校驗(yàn)。
題目模擬器的邏輯和https://github.com/cj1128/chip8-emulator基本類似蠢甲,只有ret指令的實(shí)現(xiàn)和chip8-emulator不同僵刮。
安全客有篇文章提供了chip-8 IDA processor,加載之后可以反匯編看題目的邏輯峡钓。
首先獲得10個(gè)輸入妓笙,輸出到屏幕上,輸入存儲(chǔ)在v0-v9寄存器上能岩;之后首先對(duì)10個(gè)輸入逐個(gè)做加法或者異或操作寞宫,再三個(gè)一組的做乘法求和;最后校驗(yàn)乘法和是否和固定值相等拉鹃。寫腳本爆破就能獲得后半段flag辈赋。

cmp_list = [0x21, 0x2a, 0x30, 0x37, 0x37, 0x3b, 0x1f, 0x16, 0x20, ]
multi_list = [
    [1, 2, 1],
    [2, 1, 1],
    [1, 2, 2],
    [1, 2, 1],
    [2, 1, 1],
    [1, 2, 2],
    [1, 2, 1],
    [2, 1, 1],
    [1, 2, 2]
]

flag = "6c8f1d78770fe672122478c6f9a150e0"

for n in xrange(3):
    for i in xrange(32):
        for j in xrange(32):
            for k in xrange(32):
                if n == 0:
                    x = i + 2
                    y = j + 1
                    z = (k+1) ^ 1
                if n == 1:
                    x = i + 3
                    y = j + 2
                    z = (k^2)+1
                if n == 2:
                    x = i + i
                    y = j + 1
                    z = (k^1)+1

                if cmp_list[3*n] == x * multi_list[3*n][0] + y * multi_list[3*n][1] + z * multi_list[3*n][2] \
                and cmp_list[3*n+1] == x * multi_list[3*n+1][0] + y * multi_list[3*n+1][1] + z * multi_list[3*n+1][2] \
                and cmp_list[3*n+2] == x * multi_list[3*n+2][0] + y * multi_list[3*n+2][1] + z * multi_list[3*n+2][2] :
                    print "%x%x%x" % (i, j, k)
                    flag += "%x%x%x" % (i, j, k)
                
flag += "3"
print "flag{%s}" % flag
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市膏燕,隨后出現(xiàn)的幾起案子钥屈,更是在濱河造成了極大的恐慌,老刑警劉巖坝辫,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篷就,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡近忙,警方通過查閱死者的電腦和手機(jī)竭业,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)及舍,“玉大人未辆,你說(shuō)我怎么就攤上這事【饴辏” “怎么了咐柜?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)攘残。 經(jīng)常有香客問我拙友,道長(zhǎng),這世上最難降的妖魔是什么歼郭? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任献宫,我火速辦了婚禮,結(jié)果婚禮上实撒,老公的妹妹穿的比我還像新娘姊途。我一直安慰自己涉瘾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布捷兰。 她就那樣靜靜地躺著立叛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贡茅。 梳的紋絲不亂的頭發(fā)上秘蛇,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音顶考,去河邊找鬼赁还。 笑死,一個(gè)胖子當(dāng)著我的面吹牛驹沿,可吹牛的內(nèi)容都是我干的艘策。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渊季,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼朋蔫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起却汉,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤驯妄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后合砂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體青扔,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年翩伪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赎懦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡幻工,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出黎茎,到底是詐尸還是另有隱情囊颅,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布傅瞻,位于F島的核電站踢代,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嗅骄。R本人自食惡果不足惜胳挎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望溺森。 院中可真熱鬧慕爬,春花似錦窑眯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至姥卢,卻和暖如春卷要,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背独榴。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工僧叉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棺榔。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓瓶堕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親掷豺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捞烟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354