[title]WEB[/title]

WEB

枯燥的抽奖

题目

解题步骤

没看到什么特别的东西,先F12看看情况,发现了后端源代码

COPY下来:

<?php
#这不是抽奖程序的源代码!不许看!
header("Content-Type: text/html;charset=utf-8");
session_start();
if(!isset($_SESSION['seed'])){
$_SESSION['seed']=rand(0,999999999);
}

mt_srand($_SESSION['seed']);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){
    $str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);       
}
$str_show = substr($str, 0, 10);
echo "<p id='p1'>".$str_show."</p>";


if(isset($_POST['num'])){
    if($_POST['num']===$str){x
        echo "<p id=flag>抽奖,就是那么枯燥且无味,给你flag{xxxxxxxxx}</p>";
    }
    else{
        echo "<p id=flag>没抽中哦,再试试吧</p>";
    }
}
show_source("check.php");

看到代码发现漏洞:mt_rand函数是个伪随机函数,所以可以从前10位字母组合中算出原始种子,再由原始种子算出后10位组合

先写一个脚本,算出前10位的位偏移量:

#include<stdio.h>
#include<string.h>
int main() {
    char a[] = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int i;
    int j;
    char b[] = "v1gW2XBKpv";
    for (j = 0;j < strlen(b);j++) {
        for (i = 0;i < strlen(a);i++) {
            if (a[i]==b[j]) {
                printf("%d %d 0 61 ", i,i);
            }
        }
    }
}

结果:

 
工具:php_mt_seed 
 
得到原始种子:145715557
 
将原始代码做出修改后得出后10位:v1gW2XBKpvS2G8Xh3XkN
 
最后得到flag:

BabySqli

题目提示:刚学完sqli,我才知道万能口令这么危险,还好我进行了防护,还用md5哈希了密码!

首先,众所周知的万能口令是

select * from user where name =a' or 1=1

显然这题没有那么简单

丢入sqlmap扫描后发现得到的是md5加密后的密码,所以除非md5爆破否则得不到答案。

用admin和admin测试之后发现

发现base32代码,初次解码后再经base64解码得:

select * from user where username = '$name'

在经测试后猜想:后端先比较用户名,当用户名为admin后,将密码md5加密后在数据库中进行比较,由此得到解题思路:

将前半部分代码为假,后部分用union联合,使其符合要求。

用fuzz检查,发现过滤了and和‘=’号,and用And代替,‘=’用‘>’代替。

结合sqlmap中得到的select有三个列,写出注入代码:

name=admin' And 1>2 union select '2','admin','21232f297a57a5a743894a0e4a801fc3&pw=admin

最后得到flag:GXY{y0u_4re_not_aDmin!}


[title]MSIC[/title]

MSIC

发现是道需要nc连接的杂项题,想到了PWNtools,测试之后发现要猜的数字小于

 


gakki

拿到手后binwalk一下,发现藏了个压缩包,尝试爆破,得到密码8864。

解压后是一个txt文件,里面杂乱无章,猜想有可能是要字频统计,尝试一番之后发现猜的没错,得到flag


[title]RE[/title]

RE

very_easy_re

拉进IDA,F5反编译源码

从反编译的代码中看出,flag长度为34位,且经过计算后与字符串“WV6EWF[8dGU5]Y<pQZ8iPZ8iSKk7gnh=”相同。

写出逆向代码:

#include<stdio.h>
#include<string.h>
int main(){
    char v8[]="WV6EWF[8dGU5]Y<pQZ8iPZ8iSKk7gnh=";
    int i;
    int v2;
    for ( i = 0; ; ++i )
    {
      v2 = strlen(v8);
      if ( i >= v2 )
        break;
      if ( i < 8 )
        --v8[i];
      if ( i >= 8 && i < 16 )
        v8[i] -= 3;
      if ( i >= 16 && i < 24 )
        v8[i] -= 3;
      if ( i >= 24 && i < 32 )
        v8[i] -= 4;
    }
    puts(v8);
}

得到原始字符串“VU5DVEZ7aDR2ZV9mNW5fMW5fOGg3cjd9”,对其base64转码得到flag:UNCTF{h4ve_f5n_1n_8h7r7}


调试器的初体验

首先运行程序:

提示打开方式不对,联系题目名字,拖入OD,运行程序,得到base64:

转码得flag:

flag{16cea37e53405a8b1b8a7de219e8edd1}