本文字数:1947|预计3分钟读完
“网鼎杯”是迄今为止全球规模最大、覆盖面最广的国家级网络安全赛事,被称为网络安全“奥运会”,目前已成功举办3届。
部分选手甚至可以直接评获奖证书入职大厂、特殊人才引进。
号主参加了两届“网鼎杯”,今天分享整理一下部分赛题
文丨hacking
雷军是如何又造手机和又造车的?
1
赛事平台高-举办方
2024届“网鼎杯”已经开始报名,让我们看看近两届主办方就知道赛事的含金量有多大了,第3届“网鼎杯”
第3届“网鼎杯”
由公安部指导,国家网络与信息安全信息通报中心、浙江省公安厅、杭州市人民政府共同支持,杭州市公安局和余杭区人民政府联合主办。
第4届“网鼎杯”
由公安部、教育部共同指导,贵阳市人民政府、贵州省公安厅联合主 办,国家网络与信息安全信息通报中心、教育部教育管理信息中心、网络空间 安全专业教学指导委员会作为支持单位,公安部第一研究所作为承办单位。
。
2
2022年 第3届 白虎组
"网鼎杯"难度果然不一般,整理了部分解题过程,供大家学习。(后期会将做题文件上传)
解题过程
签到题
八道网络安全选择题,百度都能搜索,记不全了
杂项1
破压缩包
得到密码
得到excel里,打开,passwd解密
7EqufFnrSGk= |
用nmy0612打开flag.7z
里面韩文,用工具解密
Cyberchef
crypto582
题目
from Crypto.Util.number import getPrime
import hashlib
e = 2022
m = getPrime(512)
m1 = getPrime(512)
m2 = getPrime(512)
flag = m + m1 + m2
flag = hashlib.md5(str(flag).encode('utf-8')).hexdigest()
c1 = pow(m+m1,e,m*m1)
c2 = pow(m+m2,e,m*m2)
c3 = pow(m1+m2,e,m1*m2)
x = pow(m1+2022,m,m*m1)
y = pow(m2+2022,m,m*m2)
z = pow(m+2022,m1,m*m1)
print('c1 =',c1)
print('c2 =',c2)
print('c3 =',c3)
print('x =',x)
print('y =',y)
print('z =',z)
'''
c1 = 85139434329272123519094184286276070319638471046264384499440682030525456122476228324462769126167628121006213531153927884870307999106015430909361792093581895091445829379547633304737916675926004298753674268141399550405934376072486086468186907326396270307581239055199288888816051281495009808259009684332333344687
c2 = 104554808380721645840032269336579549039995977113982697194651690041676187039363703190743891658905715473980017457465221488358016284891528960913854895940235089108270134689312161783470000803482494370322574472422461483052403826282470850666418693908817591349159407595131136843764544166774390400827241213500917391144
c3 = 94771625845449128812081345291218973301979152577131568497740476123729158619324753128517222692750900524689049078606978317742545997482763600884362992468406577524708622046033409713416026145377740182233674890063333534646927601262333672233695863286637817471270314093720827409474178917969326556939942622112511819330
x = 78237329408351955465927092805995076909826011029371783256454322166600398149132623484679723362562600068961760410039241554232588011577854168402399895992331761353772415982560522912511879304977362225597552446397868843275129027248765252784503841114291392822052506837132093960290237335686354012448414804030938873765
y = 100442166633632319633494450595418167608036668647704883492068692098914206322465717138894302011092841820156560129280901426898815274744523998613724326647935591857728931946261379997352809249780159136988674034759483947949779535134522005905257436546335376141008113285692888482442131971935583298243412131571769294029
z = 104712661985900115750011628727270934552698948001634201257337487373976943443738367683435788889160488319624447315127992641805597631347763038111352925925686965948545739394656951753648392926627442105629724634607023721715249914976189181389720790879720452348480924301370569461741945968322303130995996793764440204452
'''
解密脚本
费马定理
import hashlib,math
e=2022
c1 = 85139434329272123519094184286276070319638471046264384499440682030525456122476228324462769126167628121006213531153927884870307999106015430909361792093581895091445829379547633304737916675926004298753674268141399550405934376072486086468186907326396270307581239055199288888816051281495009808259009684332333344687
c2 = 104554808380721645840032269336579549039995977113982697194651690041676187039363703190743891658905715473980017457465221488358016284891528960913854895940235089108270134689312161783470000803482494370322574472422461483052403826282470850666418693908817591349159407595131136843764544166774390400827241213500917391144
c3 = 94771625845449128812081345291218973301979152577131568497740476123729158619324753128517222692750900524689049078606978317742545997482763600884362992468406577524708622046033409713416026145377740182233674890063333534646927601262333672233695863286637817471270314093720827409474178917969326556939942622112511819330
x = 78237329408351955465927092805995076909826011029371783256454322166600398149132623484679723362562600068961760410039241554232588011577854168402399895992331761353772415982560522912511879304977362225597552446397868843275129027248765252784503841114291392822052506837132093960290237335686354012448414804030938873765
y = 100442166633632319633494450595418167608036668647704883492068692098914206322465717138894302011092841820156560129280901426898815274744523998613724326647935591857728931946261379997352809249780159136988674034759483947949779535134522005905257436546335376141008113285692888482442131971935583298243412131571769294029
z = 104712661985900115750011628727270934552698948001634201257337487373976943443738367683435788889160488319624447315127992641805597631347763038111352925925686965948545739394656951753648392926627442105629724634607023721715249914976189181389720790879720452348480924301370569461741945968322303130995996793764440204452
a=(x-2022)**e-c1
b=(y-2022)**e-c2
c=math.gcd(a,b)
d=(x-e)%c
e=(y-e)%c+c
flag=c+d+e
flag=hashlib.md5(str(flag).encode('utf-8')).hexdigest()
print("flag{"+(flag)+"}")
Re
using namespace std;
uint32_t bit_move(uint32_t val, int n) {
int size = 8;
return (val << (size - n) | (val >> n));
}
unsigned char enc[] = {
0xF2, 0x7F, 0x09, 0x05, 0xD7, 0x77, 0x16, 0x91, 0x25, 0x01, 0x2E,
0xC5, 0x97, 0x26, 0x63, 0x82, 0x01, 0x40, 0x15, 0x2D, 0xFC, 0x53,
0xDB, 0xD3, 0xC4, 0xDB, 0x0A, 0x1F, 0x82, 0x1E, 0x99, 0x4E, 0xFE,
0x0C, 0x80, 0xB8, 0xA5, 0x61, 0x0E, 0x99, 0xDF, 0x39 };
//0x6526B0D9
void sub_140001950(unsigned char* enc) {
int i;
unsigned int v1;
unsigned int v2;
unsigned int sum;
int v4;
for (i = 0; i != 5; ++i) {
v1 = *(uint32_t*)&enc[8 * i];
v2 = *(uint32_t*)&enc[8 * i + 4];
sum = 0x6526B0D9;
v4 = 32;
do {
sum += 0x61C88647;
v2 -= ((v1 << 4) + 0x43) ^ (sum + v1) ^ ((v1 >> 5) + 0x56);
v1 -= (v2 + sum) ^ ((v2 << 4) | 0xC) ^ ((v2 >> 5) + 0x2D);
--v4;
} while (v4);
*(uint32_t*)&enc[8 * i] = v1;
*(uint32_t*)&enc[8 * i + 4] = v2;
}
}
int main() {
for (int i = 0; i < 42; ++i) {
enc[i] = bit_move(enc[i], 5);
}
for (int i = 0; i < 42; ++i) {
enc[i] ^= 0x66;
enc[i] -= 0x32;
}
sub_140001950(enc);
printf("%s", enc);
return 0;
}
Web1
1.dirmap目录扫描,御剑扫不到,git源代码泄漏,githack拉去源代码
2.扫描结果找到上传页面public/index.php,注意public/index上传不成功,审计源代码查看上传逻辑.htaccess绕过
3.同时上传一句话木马和.htaccess,保证两个文件在一个目录下,
4.getshell,查看flag
3
2022年 第三届 青龙组
省流:
之前参加网鼎杯的写的解题报告,整理了一下发上来,排名能靠前全靠逆向第二题拿大分。
Crypto
题目1
解题过程 读题是一个hash函数碰撞的问题,总共13位,已知前五位,搜一搜发现苹果AirDrop采用的hash函数是sha256,写个python脚本爆破一下
1.需要找到一个8位数字的代码,将其附加到密钥"86170"后进行SHA-256哈希,结果与给定的哈希匹配。
2.暴力破解方法:遍历所有可能的8位数字组合(从"00000000"到"99999999"),将每个组合附加到密钥后进行哈希,并将结果与给定的哈希进行比较。
3.匹配即停止:当找到匹配项时,我们打印出该代码及其对应的哈希值。
import hashlib
ss = '0123456789'
txt2 = "86170"
sha256enc="c22a563acc2a587afbfaaaa6d67bc6e628872b00bd7e998873881f7c6fdc62fc"
key=txt2
for a in ss:
for b in ss:
for c in ss:
for d in ss:
for e in ss:
for f in ss:
for g in ss:
for h in ss:
code = a+b+c+d+e+f+g+h
encinfo = hashlib.sha256(bytes( (key+code).encode() ) ).hexdigest()
if encinfo == sha256enc:
print(code)
print(encinfo)
break
得到未知密文部分为“91733716” 拼起来即为flag:{8617091733716}
Reverse
题目1
解题过程 下载文件是一个Windows可执行程序Re2.exe。运行程序时,提示输入flag。
使用IDA Pro打开程序文件,发现只有几个函数,这表明程序可能进行了加壳处理。看到红框部分指令(如图片中所示),这通常表示程序在解压完成后进入真正的指令执行部分。
将程序拖入x64dbg,在怀疑的解压完成处设置断点,方便后续快速进入真实指令执行部分。尝试使用x64dbg逐步分析程序,但感觉不太顺利。尝试查了下壳,使用DetectEasy发现是upx壳。
尝试使用命令upx -d Re2.exe进行脱壳,但未成功,可能程序进行了防护处理。使用010 Editor打开程序,发现一些被替换的内容(如UPX0和UPX1),手动将它们修改回原始值。分别修改成UPX0和UPX1
再次使用UPX脱壳命令,成功脱壳。结合IDA的静态分析和x64dbg的动态调试,可以更快地进行后续分析。
根据之前分析,直接在ida中找到对输入求长度并判断的部分(从字符串中也可以找到)
在IDA中找到对输入求长度并判断的部分代码(如图片所示)。第一个校验点:输入长度应为20。第二个校验点:输入的每个字符进行异或运算(如0x66)。
进入sub_1400111E5函数,查看详细的校验逻辑。代码简单对输入进行了运算,并将结果与全局数组内容进行比较。
就简单对输入运算了下,最后判断运算结果和如下图的全局数组内容是否一致,这只需要反着计算即可拿到flag
已知全局数组的内容:
a = [0x4B, 0x48, 0x79, 0x13, 0x45, 0x30, 0x5C, 0x49, 0x5A, 0x79, 0x13, 0x70, 0x6D, 0x78, 0x13, 0x6F, 0x48, 0x5D, 0x64, 0x64, 0x18]
逆向运算得到flag:
for b in a:
print(chr(((b ^ 0x50) - 10) ^ 0x66), end="")
a = [0x4B, 0x48, 0x79, 0x13, 0x45, 0x30, 0x5C, 0x49, 0x5A, 0x79, 0x13, 0x70, 0x6D, 0x78, 0x13, 0x6F, 0x48, 0x5D, 0x64, 0x64, 0x18]
for b in a:
print(chr(((b^0x50) - 10)^0x66), end="")
运行则得flag
题目2
解题过程
拿到apk发现安装不成,尝试重新打包成apk并签名,成功安装 使用mt管理器反编译一下dex,发现函数指令被抽走了,再一看luoyesiqiu.shell里的类,更加确定是函数抽取型加固,得想办法把恢复原始dex,一开始使用blackdex64来恢复,没成功
于是考虑使用frida脚本,github有dump dex的,直接用一下命令
frida-dexdump -U -f com.example.testchouqu
成功提出dex文件,如下图
依次用mt管理器打开,找到有Checkfxxk的dex,这里是classes02.dex,执行dex2jar转换为jar包,方便分析,使用jd-jui打开分析。
思路很明确,输入两个字符串,一个必须是“helloctf”,另一个需要逆向出来。可以看到代码使用了控制流混淆,没猜错的话用的是BlackObfuscator(Android Dex控制流平坦化混淆)。尝试寻找反混淆的工具,未果,只好硬分析,期间又尝试了执行该class中的函数,但会死循环。分析差不多,主要是下面的代码
猜测应该是已有的某种加密,否则不会这么复杂,查询资料发现基本和tea加密一样,i6,i8相当于两个明文,i2即sum,1640531527为delta,循环32轮。原始tea加密过程中delta是成倍增加的,但在这里是成倍减少,因此解密算法也和常规的不一样,这里也花了大量时间去思考 解密时delta初始值应该是加密是最后的那个delta值,并且要成倍递增才行。下图是最终比较阶段,可以看到new byte[]后8个字节是可打印的字符,再考虑到arrayofInt2[0]=i6 arrayofInt2[1]=i8,即只对前8字节进行tea加密,因此要输入的后8个字符串就是下面后8个字节,前八个字节按照上面说的tea解密算法解密即可。
写脚本解密即可拿到flag
public class HelloWorld {
// 将byte转换为无符号int
public static int transform(byte b) {
return b < 0 ? b + 256 : b;
}
// 将int转换为byte数组
public static byte[] toHH(int n) {
byte[] b = new byte[4];
b[3] = (byte) (n & 0xff);
b[2] = (byte) (n >> 8 & 0xff);
b[1] = (byte) (n >> 16 & 0xff);
b[0] = (byte) (n >> 24 & 0xff);
return b;
}
public static void main(String[] args) {
// 预设的加密数组和byte数组
int[] arrayint = {2023708229, -158607964, -2120859654, 1167043672};
byte[] p = {-63, -69, -86, 43, 126, 114, 32, -75};
// 将byte数组转换为int
int i6 = transform(p[3]) | transform(p[2]) << 8 | transform(p[1]) << 16 | p[0] << 24;
int i8 = transform(p[7]) | transform(p[6]) << 8 | transform(p[5]) << 16 | p[4] << 24;
// TEA解密算法
int k = arrayint[0];
int m = arrayint[1];
int n = arrayint[2];
int i1 = arrayint[3];
int i2 = 0 - 32 * 1640531527; // 初始delta值为加密时的最后一个delta值
for (int a = 0; a < 32; a++) {
i8 -= ((i6 << 4) + n) ^ (i6 + i2) ^ ((i6 >> 5) + i1);
i6 -= ((i8 << 4) + k) ^ (i8 + i2) ^ ((i8 >> 5) + m);
i2 += 1640531527; // delta值递增
}
// 转换解密结果并打印
byte[] res = toHH(i6);
byte[] res2 = toHH(i8);
byte[] other = {102, 49, 65, 103, 121, 107, 111, 99}; // 固定的后8位
for (byte b : res) {
System.out.print((char) b);
}
for (byte b : res2) {
System.out.print((char) b);
}
for (byte b : other) {
System.out.print((char) b);
}
}
}
题目3
题目是go语言写的东西,首先安装配置go运行环境,花了点时间,将内容复制到Challenge.go
解题过程 执行go run challenge.go
让输入两个函数 函数1:该函数有6个参数,第三个参数名字为gLIhR 打开文件并搜索gLIhR:使用代码编辑器打开challenge.go文件,搜索字符串gLIhR。我们需要找到一个有6个参数的函数,并且第三个参数名为gLIhR。
在Go语言中,函数定义的形式通常如下:
func functionName(param1 type1, param2 type2, gLIhR type3, param4 type4, param5 type5, param6 type6) returnType {
// function body
}
函数2:该函数被3个函数调用,且该函数调用了函数cHZv5op8rOmlAkb6
该题纯粹体力活,函数1查找gLIhR string,寻找满足条件的即可
函数2查找return cHZv5op8rOmlAkb6(,然后有查找该项的调用者的名字,统计次数,看是否被其他函数调用了3次,
最终可得到下面结果
4
2022年 第三届 部分其他题
Crypto
题目
解题过程
import hashlib
ss = '0123456789'
txt2 = "86170"
sha256enc="c22a563acc2a587afbfaaaa6d67bc6e628872b00bd7e998873881f7c6fdc62fc"
key=txt2
for a in ss:
for b in ss:
for c in ss:
for d in ss:
for e in ss:
for f in ss:
for g in ss:
for h in ss:
code = a+b+c+d+e+f+g+h
encinfo = hashlib.sha256(bytes( (key+code).encode() ) ).hexdigest()
if encinfo == sha256enc:
print(code)
print(encinfo)
break
Reverse 1
题目
解题过程
a = [0x4B, 0x48, 0x79, 0x13, 0x45, 0x30, 0x5C, 0x49, 0x5A, 0x79, 0x13, 0x70, 0x6D, 0x78, 0x13, 0x6F, 0x48, 0x5D, 0x64, 0x64, 0x18]
for b in a:
print(chr(((b^0x50) - 10)^0x66), end="")
Reverse 2
题目
解题过程
frida-dexdump -U -f com.example.testchouqu
public class HelloWorld {
//主函数,主方法,程序的入口 main
public static int transform(byte b){
int res;
if(b<0){
res = b + 256;
}else{
res = b;
}
return res;
}
public static byte[] toHH(int n) {
byte[] b = new byte[4];
b[3] = (byte) (n & 0xff);
b[2] = (byte) (n >> 8 & 0xff);
b[1] = (byte) (n >> 16 & 0xff);
b[0] = (byte) (n >> 24 & 0xff);
return b;
}
public static void main(String[] args) {
//输出语句
int[] arrayint = {2023708229, -158607964, -2120859654, 1167043672};
byte[] p = {-63, -69, -86, 43, 126, 114, 32, -75};
int i = transform(p[3]) | transform(p[2]) << 8 | transform(p[1]) << 16 | p[0] << 24;
int j = transform(p[3+4]) | transform(p[2+4]) << 8 | transform(p[1+4]) << 16 | p[0+4] << 24;
int k = arrayint[0];
int m = arrayint[1];
int n = arrayint[2];
int i1 = arrayint[3];
int i6 = i;
int i8 = j;
int i2 = 0 - 32*1640531527;
for(int a=0;a<32;a++){
i8 -= (i6<<4) + n^i6 + i2^(i6>>5) + i1;
i6 -= (i8<<4) + k^i8 + i2^(i8>>5) + m;
i2 += 1640531527;
}
byte[] res = toHH(i6);
byte[] res2 = toHH(i8);
byte [] other = {102, 49, 65, 103, 121, 107, 111, 99};
for (byte b : res) {
System.out.print((char)b+"");
}
for (byte b : res2) {
System.out.print((char)b+"");
}
for (byte b : other) {
System.out.print((char)b+"");
}
}
}
Reverse3
题目
解题过程
【Hacking黑白红】,一线渗透攻防实战交流公众号
回复“电子书”获取web渗透、CTF电子书:
回复“视频教程”获取渗透测试视频教程;
回复“内网书籍”获取内网学习书籍;
回复“CTF工具”获取渗透、CTF全套工具;
回复“内网渗透”;获取内网渗透资料;
回复“护网”;获取护网学习资料 ;
回复“python”,获取python视频教程;
回复“java”,获取Java视频教程;
回复“go”,获取go视频教程
知识星球
【Hacking藏经阁】知识星球致力于分享技术和认知。
1、技术方面。主攻渗透测试(web和内网)、CTF比赛、逆向、护网行动等;
400G渗透教学视频、80多本安全类电子书、50个渗透靶场(资料主要来自本人总结、以及学习过程中购买的课程)
2、认知方面。副业经营、人设IP打造,具体点公众号运营、抖*yin等自媒体运营(目前主要在运营两个平台4个号)。
如果你也想像我一样,不想35岁以后被动的去面试,那么加入星球我们一起成长。
欢迎加入99米/年,平均每天2毛7分钱,学习网络安全一整年。
▶【渗透实战系列】|52-记一次"91"站点渗透
▶【渗透实战系列】51|- 一次BC站点的GetShell过程
▶【渗透实战系列】50|- Log4j打点后与管理员斗智斗勇
▶【渗透实战系列】49|-实战某高校的一次挖矿病毒的应急处置
▶【渗透实战系列】|45-记一次渗透实战-代码审计到getshell
▶【渗透实战系列】|44-记一次授权渗透实战(过程曲折,Java getshell)
▶【渗透实战系列】|42-防范诈骗,记一次帮助粉丝渗透黑入某盘诈骗的实战
▶【渗透实战系列】|40-APP渗透测试步骤(环境、代理、抓包挖洞)
▶【渗透实战系列】|35-旁站信息泄露的dedecms站点渗透
▶【渗透实战系列】|33-App渗透 ,由sql注入、绕过人脸识别、成功登录APP
▶【渗透实战系列】|32-FOFA寻找漏洞,绕过杀软拿下目标站
▶【渗透实战系列】|30-从SQL注入渗透内网(渗透的本质就是信息搜集)
▶【渗透实战系列】|29-实战|对某勒索APP的Getshell
▶【渗透实战系列】|27-对钓鱼诈骗网站的渗透测试(成功获取管理员真实IP)
▶【渗透实战系列】|25一次从 APP 逆向到 Getshell 的过程
▶【渗透实战系列】|24-针对CMS的SQL注入漏洞的代码审计思路和方法
▶【渗透实战系列】|18-手动拿学校站点 得到上万人的信息(漏洞已提交)
▶【渗透实战系列】|17-巧用fofa对目标网站进行getshell
▶【渗透实战系列】|15-博彩网站(APP)渗透的常见切入点
▶【渗透实战系列】|12 -渗透实战, 被骗4000花呗背后的骗局
▶【渗透实战系列】|10 - 记某色X商城支付逻辑漏洞的白嫖(修改价格提交订单)
▶【渗透实战系列】|9-对境外网站开展的一次web渗透测试(非常详细,适合打战练手)
▶【渗透实战系列】|8-记一次渗透测试从XSS到Getshell过程(详细到无语)
▶【渗透实战系列】|1一次对跨境赌博类APP的渗透实战(getshell并获得全部数据)
点分享
点收藏
点点赞
点在看