1. 程式人生 > >ISCC2017部分題目wp

ISCC2017部分題目wp

                     

Basic–Wheel Cipher

Basic–神祕圖片

兩張png圖片,放一起了,後面那張是 豬圈密碼,解出來是 GOODLUCK 但flag是小寫 flag:goodluck

Basic–告訴你個祕密

開始看到有兩行hex串,還以為是兩個字串的運算,其實不是 先轉成兩個字串,然後base64解碼,接下來是鍵盤,就看到答案了 flag:TONGYUAN

Basic–你猜猜

文字檔案是壓縮包的16進位制,用winhex存成壓縮包之後,就沒思路了,試過偽加密,crc爆破 你猜猜。。我比較笨,沒想到弱密碼,小夥伴說用 123456 就好了 flag:daczcasdqwdcsdzasd

Basic–二維碼

掃二維碼得到一句話:The password of the router is our flag 圖片後面有壓縮包,還是有密碼,,繼續找線索吧, 發現二維碼圖片的名字有點奇怪,是unicode編碼,document.write()輸出一下,內容是: 密碼純數字共8位 用到一個工具:ARCHPR ,設定一下,很快就出來了:20161114 解壓之後的破解記錄裡說:前四位是ISCC 後四位由大寫字母和數字構成 用到另外一個工具:EWSA5.9(6.4容易崩),用裡面的掩碼攻擊,設定一個自定義字符集 ,掩碼設定成 ISCC?1?1?1?1 (這裡的1是我的自定義字符集,有大寫字母和全部數字),解出來就是flag flag:ISCC16BA

Basic–說我作弊,需要證據

分析發現,只有13給37發內容了,37給13的只是一些迴應 data應該是拿Bob的公鑰加密的,所以要用Bob的私鑰解密 sig應該是拿Alice的私鑰簽名的,所以應該用Alice的公鑰解密 data和sig相同才算是正確的資訊,所以解密之後比較是否相同,若解密結果相同,則存入一個數組中,之後再根據seq的值對陣列進行排序,得到正確的flag

題目給的應該是兩個人的公鑰,上面說了思路,下面上指令碼吧

# !python3# coding:utf8# Alice的RSA公鑰為(n, e) = (0x53a121a11e36d7a84dde3f5d73cf, 0x10001) (192.168.0.13)?,
#  ap =  38456719616722997   aq =  44106885765559411#  ad = 37191940763524230367308693117833# Bob的RSA公鑰為(n, e) =(0x99122e61dc7bede74711185598c7, 0x10001) (192.168.0.37)# bp =  49662237675630289  bq =  62515288803124247# bd = 1427000713644866747260499795119265import binasciian = 0x53a121a11e36d7a84dde3f5d73cfae = 0x10001
ad = 37191940763524230367308693117833bn = 0x99122e61dc7bede74711185598c7be = 0x10001bd = 1427000713644866747260499795119265lines = open("13-37base.txt",'r').readlines()tflag = []for line in lines:    cons = line.decode("base64"# 首先是base64解密    con = cons.split(';')    # 轉換成各自對應的數字    seq = int(con[0][6:],10)    data = int(con[1][10:-1],16)    sig = int(con[2][9:-1],16)    try:        # 用Bob的私鑰解密        d_data = hex(pow(data,bd,bn))[2:-1].decode("hex")        # 用Alice的公鑰解密        d_sig = hex(pow(sig,0x10001,0x53a121a11e36d7a84dde3f5d73cf))[2:-1].decode("hex")        # 一致則儲存        if(d_data == d_sig):            print(seq,d_data)            tflag.append([seq,d_data])    except Exception as e:        # print("Error")        pass# 進行排序tflag.sort(key=lambda y: int(y[0]))flag = ""for t in tflag:    flag += t[1]print(flag)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

flag:flag{n0th1ng_t0_533_h3r3_m0v3_0n}

Basic–公郵密碼

下載的壓縮包解壓之後,得到一個文字檔案和一個壓縮包 文字檔案沒有內容,名字比較奇怪:pw WINDoWsSEViCEss 而且看看壓縮包有密碼,所以找密碼吧 pw就是密碼吧,後面的字串只有大寫字母和小寫字母,兩種形式的話,想到了培根密碼,大寫字母當A,小寫字母當B,解出來是BIT,然後就解壓成功,base64解碼得到flag flag:Flag:{Ly319.i5d1f*iCult!}

Basic–PHP_encrypt_1

原始碼很少,而且說加密是可逆的,那就逆推一下

<?phpfunction encrypt($data,$key){    $key = md5('ISCC');   // $key ="729623334f0aa2784a1599fd374c120d"    $x = 0;    $len = strlen($data);    $klen = strlen($key);    $char = "";    for ($i=0; $i < $len; $i++) {         if ($x == $klen)        {            $x = 0;        }        $char .= $key[$x];        $x+=1;    }    // # $char = "729623334f0aa2784a1599fd374c120d729623";    for ($i=0; $i < $len; $i++) {        $str .= chr((ord($data[$i]) + ord($char[$i])) % 128);    }    return base64_encode($str);}encrypt("11111111111111111111111111111111111111",2);?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

首先是$key的值,很容易得到 把加密後的base64串解碼不能正常輸出,有不可見字元,但是可以知道解碼之後的長度,為 38 這樣之後就可以在原來的程式碼裡處理一下得到$char 的值 $str雖然不能輸出,但還是可以拿來用的,接下來就是爆破了,看指令碼:

# !python3# coding:utf8from hashlib import md5import stringenstr = "fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA="str1 = enstr.decode("base64")str1_len = len(str1)key = md5("ISCC").hexdigest()char = "729623334f0aa2784a1599fd374c120d729623"  # 用php程式碼得到flag = ""for i in range(str1_len):    num = ord(str1[i])    for c in string.printable:        if(num == (ord(c) + ord(char[i])) % 128):            flag += c            breakprint(flag) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

flag:Flag:{asdqwdfasfdawfefqwdqwdadwqadawd}

Mobile–簡單到不行

稍微看下,涉及到了.so檔案,用IDA32開啟,找到checkflag函式,反編譯之後是這樣 這裡寫圖片描述 也就是這樣

 j = 0for ( i = 0; ; ++i )  {    --j;    if ( i >= flag_len / 2 )      break;    tmpChar = flag[i] - 5;    flag[i] = flag[flag_len + j];    flag[flag_len + j] = tmpChar;  }  flag[flag_len] = 0;  v12 = strcmp(flag, "=0HWYl1SE5UQWFfN?I+PEo.UcshU");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

邏輯就是把前一半每一位減5,然後和後一半交換位置 解一下就好了

#! python3# coding:utf8aa = "=0HWYl1SE5UQWFfN?I+PEo.UcshU"str1 = "=0HWYl1SE5UQWF"for i in range(14,28):    str1 += chr(ord(aa[i])+5)print(str1[::-1].decode('base64'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

flag:flag{ISCCJAVANDKYXX}

Misc–眼見非實

解壓word文件,搜flag就出來了 flag:flag{[email protected]}

Misc–就在其中

開始看了下,感覺太多了,就用binwalk來提取檔案,得到的檔案裡有 key.txt,AC76.key(開始是一個私鑰),就嘗試RSA解密,kali下的openssl 這裡寫圖片描述 flag又沒有格式。。 flag:haPPy_Use_0penSsI

Misc–很普通的Disco

# ! python3# coding:utf8import reaa = "110011011011001100001110011111110111010111011000010101110101010110011011101011101110110111011110011111101101010110110101010110101101101101101101101011010110110101010101101011010110110101010101010110101011011111101011010101101111010101011010101111010101110101010101001010111101111011010101010111110111101010101010110101110101010101110101011010101010101010101010101101010110111110111101110101011101011101101010111111010101010101101010101010101010101011101010101010110101010110110110101101101010101101011111010110101101101011101010101010101011010101111111010111010101010110101010101010110101001010101010110100101101010101011010101011010101011010101011101111011101010101010111010101101010101101101010101010101010101110101101010101011011111101011010101010101010110101101110110101111111010101101010110101111110101010110101101011110101010111010101010101101011011010111010010101010111110010110111101010111110101010110101101010111110101010110101101011110111101011010101010101010101101011011111010110110101010101010111101010101010100101101010110101010110101101010110101010100101101010101011011010101111111101010101010100101010101111001010111010101110101010101010101101011010101010101101010101010101011110101110101111011101010111101010101011011111101010101011"bb=re.findall(r'.{7}',aa)str1 = ""for b in bb:    str1 += chr(int(b,2))print(str1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

結果: flag{W0W*funny}UZV[6m5ZUV[UU_VVzVWUjTW^jWo*V]*u5*U++>{UkZ_U+*U*u*j[5ZV_-6]*UU~]*jU5+%U-+*j]w*W+*m*U.ZU_VU*k;/u55}+-=+U+-W%+ro+u-5>UV^zjU+-zm*WU–+–-*m/zU%+e:]*UVU-*UuknWU-}

flag:flag{W0W*funny}

小夥伴用audaciry發現在音訊擡頭很小的一段裡,隱藏了一些波形 這裡寫圖片描述 在上面折就是1,在下面折就是0,雖然搞不太明白,大概就是這個原理

Misc–很普通的數獨

25張數獨圖片,解出來能幹什麼呢,沒什麼思路 跟解數獨沒關係,小夥伴讓我仔細看看,看著看著突然發現可能是二維碼, 怎麼轉換呢?我轉了一個大彎, 先用畫圖, 失敗之後用寫01串,空格黑方塊替換,還是掃不出來, 接著小夥伴提示二維碼原理,去看了一遍二維碼原理,還是沒思路, 小夥伴又提示拼圖,我就重新搞出了25張小圖片打算 拼一拼,然而發現太亂了,沒法拼出來, 最後再看看,也許只換換那三個不協調的角的位置呢?換完之後果斷掃出來了 這裡寫圖片描述 base64編碼的字串: Vm0xd1NtUXlWa1pPVldoVFlUSlNjRlJVVGtOamJGWnlWMjFHVlUxV1ZqTldNakZIWVcxS1IxTnNhRmhoTVZweVdWUkdXbVZHWkhOWGJGcHBWa1paZWxaclpEUmhNVXBYVW14V2FHVnFRVGs9 經過7次解碼之後就得到flag flag:flag{y0ud1any1s1}

Misc–再見李華

下載到一張圖片,把圖片的壓縮包分出來,有密碼, 圖片上有md5值,只有16位,常規應該是20位吧,感覺應該是爆破 不少於1000個字,1000當成二進位制的話就是8了,記得署名,而且題目中有  李華(LiHua),那就是以 LiHua 結尾的 字串,爆破一下,在前面有4位的時候得到了密碼,解壓得到flag 指令碼如下:

# !python3# coding:utf8from hashlib import md5import stringdic = string.printablehalf_md5 = "1a4fb3fb5ee12307"str1 = ""for i1 in dic:    for i2 in dic:        for i3 in dic:            for i4 in dic:                str1 = i1 + i2 + i3 + i4 + "LiHua"                str1_md5 = md5(str1).hexdigest()                if half_md5 in str1_md5:                    print(str1)                    exit(0)print("Done")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

flag:Stay hungry, Stay foolish.

Web–WelcomeToMySQL

開啟是檔案上傳,但是提示卻是sql注入,不懂 傳了一個php345字尾的 一句話上去,連線不上 理解錯大表哥的意思了,應該是php檔案字尾可以是php3,php4,php5這樣的意思,傳php5字尾的上去,用菜刀連線,但是禁止檢視當前目錄,小夥伴又說去看上傳成功之後的原始碼,多了註釋 <!--$servername,$username,$password,$db,$tb were set in base.php --> 這樣就能用菜刀連線資料庫了,得到flag,flag的的格式醉了 flag: Flag:{Iscc_1s_Fun_4nd_php_iS_Easy}

Web–自相矛盾

給了原始碼,在本地搭環境測一下吧,貌似是構造一個比較複雜的json串提交,符合條件就給出flag 首先是判斷 a[“bar1”] 不能是數字,但又要大於 2016,這樣的話,構造 a[“bar1”]=”3000a”,不是一個數字,但是進行大小比較時,php會強制轉換型別,就變成了3000,這樣即可繞過  …… 終於知道為什麼那麼多人做出來了,這是原題,,xnuca有過,隊友大神 http://aurorasec.blog.51cto.com/9752323/1832173  裡面的題目4 用下面這個連結就能得到flag

http://139.129.108.53:8083/web-09/?iscc={“bar1”:”2017e”,”bar2”:[[1],1,2,3,0]}&cat[0]=00isccctf2017&cat[1][]=1111&dog=%00

flag:flag{sfklljljdstuaft}

Web–Web簽到題,來和我換flag啊!

輸入f1ag之後,出現: 哼,就給我一個flag我才不和你換呢 然後看原始碼,發現還有一個hiddenflag 傳送引數 hiddenflag=f1ag&flag=f1ag 出現: 哼,就給我一個flag我才不和你換呢 還不夠誠意,不和你換FLAG 之後再發送引數:hiddenflag=f1ag&flag=f1ag&FLAG=f1ag 在頭資訊裡即可看到flag flag:f1ag: {N0w_go1Odo!otherw3b}

Web–我們一起來日站

檢視robots.txt,發現:

## robots.txt #User-agent: * Disallow: /21232f297a57a5a743894a0e4a801fc3/Disallow: /api
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

然後訪問: http://139.129.108.53:5090/web-04/21232f297a57a5a743894a0e4a801fc3 提示:keep finding admin page! 找到 admin.php 然後試了幾個萬能密碼,用下面這個: User: something Pass: ’ or ‘1’=’1 得到flag flag:Flag:{ar32wefafafqw325t4rqfcafas}

Web–where is your flag

主頁是:******flag is in flag 掃目錄知道有flag.php 訪問得到: hint:thisisflag 小夥伴說用 index?id= 這樣一說,然後又注意到了頁面編碼格式為gbk,那應該就是寬位元組注入了 先看看有幾列吧

用order by檢測 1,2都沒有內容,3的時候出現: Unknown column ‘3’ in ‘order clause’ 所以列數為2 因為已經知道了 thisisflag is in flag  ,也就是 表名是 flag,列名是 thisisflag 構造就是這樣

但是出現錯誤:

 

Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation ‘UNION’

小夥伴說把列名 hex再unhex就可以了,不懂為什麼,可能這樣就轉換編碼了?

flag:flag:{441b7fa1617307be9632263a4497871e}

Reverse–你猜

64位elf檔案,但是我執行的時候說段錯誤,沒辦法,只能靜態分析了 前兩個字串有兩個for迴圈判斷,最後一個字串稍微比較一下來判斷 flag:flag{l1nux_crack_ILCF!}

Reverse–小試牛刀

64位elf檔案,學習了下gdb的用法,下面是IDA反編譯出來的東西,但是看不懂怎麼比較的,對不上號,結果只能來動態除錯了,

   v8 = *MK_FP(__FS__, 40LL);  s2 = 0x3929531D01070A00LL;  v5 = 0x391257391F150703LL;  v6 = 0x150F;  v7 = 0x1Bif ( strlen((const char *)flag) == 19 )  {    for ( i = 0; i <= 18; ++i )      *((_BYTE *)&s2 + i) ^= 0x66u;     // s2 異或之後是 flag{5O_easy_1t_is}    result = !memcmp((const void *)flag, &s2, 5uLL)          && *(_BYTE *)(flag + 18) == v7          && *(_BYTE *)(flag + 7) == *(_BYTE *)(flag + 10)          && *(_BYTE *)(flag + 10) == *(_BYTE *)(flag + 13)          && *(_BYTE *)(flag + 13) == SBYTE7(s2) - 49          && !memcmp((const void *)(flag + 5), (char *)&v5 + 5, 2uLL)          && !memcmp((const void *)(flag + 8), &v6, 2uLL)          && !memcmp((const void *)(flag + 11), (char *)&s2 + 5, 2uLL)          && !memcmp((const void *)(flag + 14), &v5, 4uLL);  }  else  {    result = 0LL;  }  v2 = *MK_FP(__FS__, 40LL) ^ v8;  return result;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

首先在s2變換之後加個斷點,b *0x00000000004006C4 然後執行下,得到變換之後的字串,這樣我就想直接提交了,但是不對,因為那是s2的值,不是flag,中間過程就不細解釋了, 它的比較過程就是: 前五位是 flag{, 最後一位是 }, 7,10,13是一樣的,跟進去之後發現是 “.”, 5、6一起比較,是 1t, 8、9是 is, 11、12是5O, 14、15、16、17是easy, 所以最後就是  flag{1t.is.5O.easy} flag:flag{1t.is.5O.easy}