LiteCTF2023_writeup

郑轻小队writeup

WEB

我Flag呢?

直接查看源码,在源码最下面找到flag

彩蛋1

然后在img这个js代码中,找到彩蛋1 LitCTF{First_t0_The_k3y! (1/?)

导弹迷踪

直接查看源码,最后在game.js文件中发现flag

img

img

Follow me and hack me

根据提示,用get和post各传一个参数,提交拿到flag

img

彩蛋3

根据提示 备份文件还有好吃的,dirsearch扫描网站,发现备份文件www.zip,

img

下载解压在 index.php.bak ,文件中发现彩蛋3

img

Ping

ping下并尝试执行whoami,发现有前端限制,

img

禁用js后,命令可以正常执行,并在根目录下发现了flag文件

img

ping 127.0.0.1 || cat /flag,拿到flag

img

Vim yyds

dirsearch扫描网站,发现index.php.swp文件,

img

下载打开发现一些明文后端代码

img

将 $password的值 Give_Me_Your_Flag base64加密后的密文以post请求发送,同时发送cmd,payload如下

password=R2l2ZV9NZV9Zb3VyX0ZsYWc=&&cmd=cat /flag

如下图所示,拿到flag

img

PHP是世界上最好的语言!!

发现是个代码执行框,先放段简单php脚本,发现可以执行,

img

那就好办了,直接cat flag,拿下

img

作业管理系统(被判作弊)

是一个登录框,弱口令爆破得到账号密码为 admin:admin

登录进去后是一个作业管理系统,发现有个上传文件还有创建文件的地方。创建个aa.php文件,内容为一句话木马,

img

http://node4.anna.nssctf.cn:28357/aa.php 直接访问aa.php,发现可用访问,直接用蚁剑连接,最后在根目录下找到flag

img

彩蛋2

登录到管理系统后,发现一个githubURL,

img

查看得到彩蛋2

img

彩蛋

根据前面得到的彩蛋,拼接得到flag

LitCTF{First_t0_The_k3y!_S0_ne3t?_R3ady_Pl4yer_000ne_F1rst_to_Th3_eggggggggg!}

就当无事发生

一开始没做出来,后来探姬给了提示 Github commit

想起去探姬github里找找,我github也正好follow了探姬

img

img

img

1zjs

查看网站源码,发现一个js文件

img

在js文件中发现可疑php文件

img

访问该文件,发现是个fuck代码,但是不知道是什么程序类型的代码。那就一个一个尝试呗,最终试出它是jsfuck代码,直接在控制台运行该fuck代码,拿到flag

img

这是什么?SQL !注一下 !

输入1回车,发现使用get请求,参数为id,值为输入框中输入的。而且sql语句都给出来了,看起来挺简单,直接sqlmap跑,发现存在时间盲注

img

经过sqlmap跑,得到数据库,表。最后直接dump跑出flag

python sqlmap.py -u “http://node1.anna.nssctf.cn:28548/?id=1" -p id -D ctftraining -T flag –dump

跑一下payload,得到flag

img

彩蛋4

输入2得到彩蛋4

img

Flag点击就送!

开始是个输入框,随便输入,进入到拿flag界面,

img

拿flag,但是提醒我不是管理员,

img

抓包查看流量包,发现session有蹊跷,像是flask session

img

使用网上现成的flask session解密脚本尝试一下,

img

解密成功,那么这个就确定该session就是flask框架中使用的session了

将明文更改为admin形似 {“name”:”admin”}

然后利用该脚本对明文进行加密,得到加密session,

img

去抓的包中替换掉该session,发送即得flag

img

Http pro max plus

根据提示加http头

其中的xff不可用,需要使用Client-ip替换下xff

img

发送得到新信息,是一个PHP文件

img

访问该文件,发现是个 昂…….p站????

img

感觉不读,查看源码,又得到了新信息,也是个php文件

img

访问就拿到了flag

img

PWN

只需要nc一下~

nc连接,查看docker配置文件内容,根据历史命令输入 echo $FLAG,出flag

img

口算题卡

也是nc连接,然后就慢慢算小学数学题,算100道flag就出来了,一个体力活。

REVERSE

世界上最棒的程序员

把附件导入ida中,搜索关键字 flag 得到flag

img

ez_XOR

把附件导入IDA pro,直接寻找main函数

img

找到关键代码

int __cdecl main(int argc, const char **argv, const char **envp)
{
char *Format; // [esp+0h] [ebp-80h]
char *Str2; // [esp+4h] [ebp-7Ch]
const char **v6; // [esp+8h] [ebp-78h]
char Str1[50]; // [esp+1Ch] [ebp-64h] BYREF
_WORD v8[14]; // [esp+4Eh] [ebp-32h] BYREF
int v9; // [esp+6Ah] [ebp-16h]
int v10; // [esp+6Eh] [ebp-12h]
int v11; // [esp+72h] [ebp-Eh]
int v12; // [esp+76h] [ebp-Ah]
int v13; // [esp+7Ah] [ebp-6h]
__int16 v14; // [esp+7Eh] [ebp-2h]

__main();
strcpy((char *)v8, “E}J]OrQF[V8zV:hzpV}fVF[t"); v8[13] = 0; v9 = 0; v10 = 0; v11 = 0; v12 = 0; v13 = 0; v14 = 0; printf("Enter The Right FLAG:"); scanf("%s", Str1); XOR(Str1, 3); if ( !strcmp(Str1, (const char *)v8) ) { printf("U Saved IT!\n"); return 0; } else { printf("Wrong!Try again!\n"); return main((int)Format, (const char **)Str2, v6); } } 对代码进行分析发现是将值E}J]OrQF[V8zV:hzpV}fVF[t给了v8,分析关键的异或函数,双击进入XOR(Str1, 3);
size_t __cdecl XOR(char *Str, int a2)
{
size_t result; // eax
unsigned int i; // [esp+2Ch] [ebp-Ch]

for ( i = 0; ; ++i )
{
result = strlen(Str);
if ( i >= result )
break;
Str[i] ^= 3 * a2; //异或的规则
}
return result;
}

根据代码,用chatgpt写下脚本,

a = “E}J]OrQF[V8zV:hzpV}fVF[t”
b = “”
for c in a:
b += chr(ord(c) ^ 9)
print(b)

跑一下flag就出来了

img

snake

附件是个pyc文件,使用 uncompyle6 对pyc进行反编译,但是报错,

img

google后明白了原因:是因为pyc文件的文件头magic number没有对上,需要加上magic number,并且不同python版本的magic number也不同。

如何寻找pyc的magic number以及如何添加magic number,

参考这篇文章 https://blog.csdn.net/qq_44808585/article/details/104148402

根据文章方法查看到该python版本的magic number,然后使用winhex添加上magic number反编译成功。在代码中找到有关flag的那段程序,运行后得到flag

flag = [
30, 196,
52, 252, 49, 220, 7, 243,
3, 241, 24, 224, 40, 230,
25, 251, 28, 233, 40, 237,
4, 225, 4, 215, 40, 231,
22, 237, 14, 251, 10, 169]
for i in range(0, len(flag), 2):
flag[i], flag[i + 1] = flag[i + 1] ^ 136, flag[i] ^ 119
print(bytes(flag).decode())

img

debase64

下载附件,先用ida打开看下,能看到输入20个字符到v15,在sub_401520函数将v15转换到了v4,再拿v4和v6-v14的每个字节进行比较。根据题目和进入sub_401520也可以基本确定sub_401520是个解base64的函数。

之后进入动态调试,步过sub_401520的时候发现这不是普通的base64。动态分析后能发现,原理是把base64解密顺序反过来了,用第四个字符左移两位,第三个字符右移四位这样。故只需写个加密脚本,手动把顺序倒过来就好。因为flag后有3个“=”,最后一位根据hint爆破即可。

import hashlib

key = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/“

for i in key:
str1 = f”Y0uReallyKn0wB4s{i}===”
if hashlib.md5(str1.encode()).hexdigest() == “5a3ebb487ad0046e52db00570339aace”:
print(str1)
break

运行下,拿到flag

img

CRYPTO

Hex?Hex!(初级)

丢到一键解码工具里

img

梦想是红色的 (初级)

一看就是社会主义核心价值观编码,找个在线解码网站,直接拿到flag

img

原来你也玩原神 (初级)

根据题目提示,这密文是原神里的东西,google找到原神中的文字为提瓦特字,并找到对应图

img

一个一个比对得到flag

你是我的关键词(Keyworld) (初级)

搜索在线 关键字解密

据题目描述推测密钥,最后得出秘钥为YOU,解密得到flag

img

家人们!谁懂啊,RSA签到都不会 (初级)

简单的rsa解密,去网上找个别人写好的脚本,

from Crypto.Util.number import *
import gmpy2
p = 12567387145159119014524309071236701639759988903138784984758783651292440613056150667165602473478042486784826835732833001151645545259394365039352263846276073
q = 12716692565364681652614824033831497167911028027478195947187437474380470205859949692107216740030921664273595734808349540612759651241456765149114895216695451
c = 108691165922055382844520116328228845767222921196922506468663428855093343772017986225285637996980678749662049989519029385165514816621011058462841314243727826941569954125384522233795629521155389745713798246071907492365062512521474965012924607857440577856404307124237116387085337087671914959900909379028727767057
e = 65537
n = pq
print(long_to_bytes(pow(c,(gmpy2.invert(e,(p-1)
(q-1))),n)))

跑一下,得到flag

img

factordb (中级)

把代码丢给ai分析一下,

n = 87924348264132406875276140514499937145050893665602592992418171647042491658461

得出需要分解一下n,

google找到在线分解数字网站http://factordb.com/ ,分解n得到两个数

275127860351348928173285174381581152299
319576316814478949870590164193048041239

img

然后就去网上找个现成脚本,一开始不能用,但是丢给ai,问几遍就可以正确运行了

from Crypto.Util.number import long_to_bytes

e = 65537
n = 87924348264132406875276140514499937145050893665602592992418171647042491658461
c = 87677652386897749300638591365341016390128692783949277305987828177045932576708
p1 = 275127860351348928173285174381581152299
p2 = 319576316814478949870590164193048041239
phi = (p1 - 1) * (p2 - 1)
d = pow(e, -1, phi)
m = pow(c, d, n)
print(long_to_bytes(m))

运行得到flag

img

yafu (中级)

下载附件发现了

from Crypto.Util.number import *
from secret import flag

m = bytes_to_long(flag)
n = 1
for i in range(15):
n *=getPrime(32)
e = 65537
c = pow(m,e,n)
print(f’n = {n}’)
print(f’c = {c}’)

又是分解n,找打个yafu工具分解n,

https://onboardcloud.dl.sourceforge.net/project/yafu/1.34/yafu-1.34.zip

在文件夹下输入cmd可进行使用,运行命令

.\yafu-x64 factor(15241208217768849887180010139590210767831431018204645415681695749294131435566140166245881287131522331092026252879324931622292179726764214435307)

可得到15个数

img

分别为

P10 = 2201440207

P10 = 3354884521

P10 = 4171911923

P10 = 2719600579

P10 = 4044505687

P10 = 2758708999

P10 = 2767137487

P10 = 2585574697

P10 = 2906576131

P10 = 2315495107

P10 = 3355651511

P10 = 3989697563

P10 = 4021078331

P10 = 2151018733

P10 = 2923522073

接着使用网上的脚本进行修改计算可得,可能与其他队伍脚本相似,我们是在csdn找的脚本

import gmpy2
from Crypto.Util.number import long_to_bytes

n = 15241208217768849887180010139590210767831431018204645415681695749294131435566140166245881287131522331092026252879324931622292179726764214435307
e = 65537
c = 12608550100856399369399391849907846147170257754920996952259023159548789970041433744454761458030776176806265496305629236559551086998780836655717
p1 = 2201440207
p2 = 3354884521
p3 = 2719600579
p4 = 4171911923
p5 = 2315495107
p6 = 2758708999
p7 = 3989697563
p8 = 2923522073
p9 = 2151018733
p10 = 3355651511
p11 = 2906576131
p12 = 4044505687
p13 = 4021078331
p14 = 2585574697
p15 = 2767137487
phi = (p1 - 1) * (p2 - 1) * (p3 - 1)* (p4 - 1) * (p5 - 1)* (p6 - 1) * (p7 - 1)* (p8 - 1) * (p9 - 1)* (p10 - 1) * (p11 - 1)* (p12 - 1) * (p13 - 1)* (p14 - 1) * (p15 - 1)
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print (long_to_bytes(m))

运行结果为

img

The same common divisor (高级)

题目给了n1,n3,c1,c2,e,根据代码中n1、n2、n3的运算规则,首先求出n2

google找到其他师傅现成的脚本。跑一下,拿到flag

n1= 9852079772293301283705208653824307027320071498525390578148444258198605733768947108049676831872672654449631852459503049139275329796717506126689710613873813880735666507857022786447784753088176997374711523987152412069255685005264853118880922539048290400078105858759506186417678959028622484823376958194324034590514104266608644398160457382895380141070373685334979803658172378382884352616985632157233900719194944197689860219335238499593658894630966428723660931647038577670614850305719449893199713589368780231046895222526070730152875112477675102652862254926169713030701937231206405968412044029177246460558028793385980934233
n3= 4940268030889181135441311597961813780480775970170156650560367030148383674257975796516865571557828263935532335958510269356443566533284856608454193676600884849913964971291145182724888816164723930966472329604608512023988191536173112847915884014445539739070437180314205284883149421228744714989392788108329929896637182055266508625177260492776962915873036873839946591259443753924970795669864031580632650140641456386202636466624658715315856453572441182758855085077441336516178544978457053552156714181607801760605521338788424464551796638531143900048375037218585999440622490119344971822707261432953755569507740550277088437182
c1= 7066425618980522033304943700150361912772559890076173881522840300333719222157667104461410726444725540513601550570478331917063911791020088865705346188662290524599499769112250751103647749860198318955619903728724860941709527724500004142950768744200491448875522031555564384426372047270359602780292587644737898593450148108629904854675417943165292922990980758572264063039172969633878015560735737699147707712154627358077477591293746136250207139049702201052305840453700782016480965369600667516646007546442708862429431724013679189842300429421340122052682391471347471758814138218632022564279296594279507382548264409296929401260
c2= 854668035897095127498890630660344701894030345838998465420605524714323454298819946231147930930739944351187708040037822108105697983018529921300277486094149269105712677374751164879455815185393395371001495146490416978221501351569800028842842393448555836910486037183218754013655794027528039329299851644787006463456162952383099752894635657833907958930587328480492546831654755627949756658554724024525108575961076341962292900510328611128404001877137799465932130220386963518903892403159969133882215092783063943679288192557384595152566356483424061922742307738886179947575613661171671781544283180451958232826666741028590085269
n2 = n1^n3
e = 65537
# 正确 The same common divisor (高级)
import gmpy2
import binascii
p = gmpy2.gcd(n1,n2)
q = n1 // p #不论是用n1还是n2整除p得到的q,最后得到的都是同一个明文m
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
m = gmpy2.powmod(c1,d,n1)
print(binascii.unhexlify(hex(m)[2:]))

img

Small && SEEM和探姬的游戏 && Prime

这几个直接用ai跑下代码,直接提交就行了,不管对错咋样,都是99分,能薅就薅

MISC

【Minecraft】玩的开心~~~

就进入mc服务器,一直玩,挖个钻石交换书本,flag就在书本里

签到!(初级)

关注长亭珂兰寺公众号,发送签到即可获取flag。

What_1s_BASE (初级)

base64解码得flag

img

OSINT 探姬去哪了?_0

查看图片的全部信息发现图片拍摄地点的经纬度 ,

img

先通过度分秒转度工具将度数转换为度数,

img

img

纬度:30.788508333333333

经度:120.73805555555556

然后去在线根据经纬度定位网站查询这个地点具体是什么,发现是 浙江省嘉兴市南湖区城北路728号

img

搜索该地点附近的电信公司,发现了中国电信大厦

img

flag就为 NSSCTF{中国电信大厦}

OSINT 探姬去哪了?_1

发现图片上有hacker&cratf,使用百度进行搜这个关键字,发现一个酒吧

img

则flag就是NSSCTF{黑客与精酿}

OSINT 探姬去哪了?_2

hacking club举办地点,在群里发的hacking club通知得到举办地点

https://mp.weixin.qq.com/s?__biz=MzkxMzE4MTc5Ng==&mid=2247495412&idx=1&sn=2cd1f13682b8667ac0352702648e220c&chksm=c10333fff674bae9b62c91ac1fb049673a8761eddf20e32b20063a69b4b79537fb26394b889c&mpshare=1&scene=23&srcid=0425u5AogxmMXz0LAraEKN0P&sharer_sharetime=1682411717881&sharer_shareid=f54637fbc713483f572d8b427e564fe2#rd

img

OSINT 探姬去哪了?_3

一看就是教学楼教室的门,作为探姬姬的同班同学,我直接作弊查看课表确认( ̄y▽, ̄)╭

404notfound (初级)

丢到010里,直接搜索关键字得到flag

img

OSINT 这是什么地方?!

百度搜图得到关键信息,最多的就是 这条路上的车没人敢插队,

img

google搜索,发现一个b站视频里直接说出来了答案

img

Osint小麦果汁

发现图片关键信息 hacker & craft,

img

img

百度搜索,发现是个浙江的酒吧,试了下,得到flag NSSCTF{黑客与精酿}

Take me hand (初级)

附件是个流量包,直接搜索关键字 LitCTF,看到flag

img

这羽毛球怎么只有一半啊(恼 (初级)

直接用曾哥的暴力破解png图片长宽工具一把梭哈,

img

拿到flag

img

喜欢我的压缩包么 (初级)

解压附件,发现有密码,

img

直接暴力破解,得到密码为 114514

img

解压得到flag,

img

破损的图片(初级)

使用010查看附件,通过前面的字节格式发现附件像是个png图片,但是前8个字节跟png图片的前8字节不太一样,百度搜下png图片格式

img

将附件前8字节更改后,再把附件后缀改为png,就能看到flag了

img

img

img

两仪生四象 (中级)

先将代码喂给chat,chat理解后询问它如何通过输入encoded_text输出text

chat给出代码

_hash = {“乾”: “111”, “兑”: “011”, “离”: “101”, “震”: “001”, “巽”: “110”, “坎”: “010”, “艮”: “100”, “坤”: “000”}

text = “坤乾兑艮兑坎坤坤巽震坤巽震艮兑坎坤震兑乾坤巽坤艮兑震巽坤巽艮坤巽艮艮兑兑艮震兑乾坤乾坤坤兑艮艮坤巽坤坤巽坎坤兑离坎震艮兑坤巽坎艮兑震坤震兑乾坤乾坎坤兑坎坤震艮离坤离乾艮震艮巽震离震坤巽兑艮兑坎坤震巽艮坤离乾艮坎离坤震巽坎坤兑坤艮兑震巽震巽坎坤巽坤艮兑兑坎震巽兑”

binary_text = “”
for c in text:
binary_text += _hash[c]

decoded_text = “”
for i in range(0, len(binary_text), 8):
decoded_text += chr(int(binary_text[i:i+8], 2))

print(decoded_text)

运行后发现是乱码,重新查看题目提供的代码,经过辨认可知题目中将9个*编码为90个二进制数字,猜测十个为一组进行修改

更改后的代码:

_hash = {“乾”: “111”, “兑”: “011”, “离”: “101”, “震”: “001”, “巽”: “110”, “坎”: “010”, “艮”: “100”, “坤”: “000”}

text = “坤乾兑艮兑坎坤坤巽震坤巽震艮兑坎坤震兑乾坤巽坤艮兑震巽坤巽艮坤巽艮艮兑兑艮震兑乾坤乾坤坤兑艮艮坤巽坤坤巽坎坤兑离坎震艮兑坤巽坎艮兑震坤震兑乾坤乾坎坤兑坎坤震艮离坤离乾艮震艮巽震离震坤巽兑艮兑坎坤震巽艮坤离乾艮坎离坤震巽坎坤兑坤艮兑震巽震巽坎坤巽坤艮兑兑坎震巽兑”
binary_text = “”
for c in text:
binary_text += _hash[c]
decoded_text = “”
# 将8换10
for i in range(0, len(binary_text), 10):
# 将8换10
decoded_text += chr(int(binary_text[i:i+10], 2))
print(decoded_text)

运行代码,

img

得到flag

问卷

点开题目链接,直接看到flag

NSSCTF{LitCTF_2023?It’s_time_to_g0to_zh1hu!!!}