[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);
}
}
}
}
结果:
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
babync
发现是道需要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}