零
这次比赛感觉学习到的东西挺多的,感触最深的一点想我这样的做web不得不去做逆向了,虽然略懂一点逆向知识,但也仅限于IDA查看源码分析算法,并不会复杂的调试。Misc和Crypto还算简单,Web考察很全面,学习到了很多姿势,但web题虽多也赶不上一道RE3000。另外有些脑洞问题实在无力吐槽,照顾一下我们可怜的脑细胞好么。以下是writeup,有些web题目比赛时没有做详细的记录,没法复现,只能凭记忆尽可能写的详细。
一、Crypto
1.神奇的字符串
U2FsdGVkX1+qtU8KEGmMJwGgKcPUK3XBTdM+KhNRLHSCQL2nSXaW8++yBUkSylRp
直接在站长之家解密即可,然后做凯撒位移即得到flag
flag{NSCTF_Rot_EnCryption}
2.神奇的图片
放到kali里面,binwalk一下,发现有隐藏的数据,然后用foremost提取,直接获得flag图片
3.神秘的图片+10086
用stegsolve查看图片通道,发现有二维码,直接扫扫不出来,需要反色。截图后用win7画图打开,然后ctrl+shift+i反色,再次即可得flag
flag{NSCTF_Qr_C0De}
二、Misc
1.Twitter
访问Twitter,找到如下信息
然后解密MD5构造flag提交即可
flag{NSCTF_nsfocus666}
2.WireShark
数据包分析,先用tcp>0 and http对数据包过滤,发现有rar数据,应该是要查看rar文件了,然后以二进制的方式导出,生成一个rar文件,但是文件有加密
再次查看数据包有关于密码的提示,是一个html网页,导出后可以看密码提示
然后构造字典,开始破解
破解成功后就可以看到里面的flag了
flag{NCTF_R4r_Cr4ck}
3.小绿的女神
卡片破解的题目,之前某学长有研究过学校的水卡的破解,让他指点了一下,找到了入手点。通过几次消费,查看数据变化,将16进制转化为10进制可以查找规律,一共有三行变化的数据,中间标记的位置是金额,初始值为10000,根据题目意思应该是保留两位小数应该是100.00
然后修改数据,但要注意数据之间的校验的关系,即修改金额后要修改其他的数据,以保证文件被正常解读,以下是正确的数据
提交验证后可得flag
flag{NSCTF_RfID_Cr4ck}
三、Web
1.Be careful
文件跳转的题目,由index.php跳转到index.html,抓包直接获得flag
2. Where are you come from
这真是坑啊,尝试了client-ip,X-Forwarded-For,Referer与火星的各种的组合,真是膝盖碎了一地。后来提示说本地访问,试了127.0.0.1不对,想到可能以绿盟官方的身份登陆,终于尝试出这样的组合,但是flag没有保存。
X-Forwarded-For:101.200.73.168
Referer: http://www.nsctf.net/
3.Version
这题也无力吐槽了,虽然知道要php版本,但还是在尝试了数百遍提交姿势后终于获得flag
Base64解密后放到winhex
flag:{NSCTF_6c79e9b36c08b00035287a88c6cab90f}
4.Brute force
一开始以为是纯爆破,尝试了n久之后苦逼的发现在源代码最下边有一个password.txt,真是蛋碎。下载password.txt后爆破成功获得pass,登陆后头信息里有一串base64编码是下一步的地址,访问后是小黑的留言板。一开始提示没有登录,看到cookie里有IsLogin=0参数,修改为1,又提示没有权限。应该是就是修改userlevel参数了,又开始了噩梦的般的尝试,admin、administrator、xiaohei、dahei、12345…………终于root成功了
5.Javascript
查看源代码,有一个js外链,打开后一段js代码,其中有一段编码后的js
eval(unescape("var%20strKey1%20%3D%20%22JaVa3C55pxIsAGo0DStAff%22%3B%0Avar%20strKey2%20%3D%20%22CaNUknOWThIsK3y%22%3B%0Avar%20strKey3%20%3D%20String.fromCharCode%2871%2C%2048%2C%20111%2C%20100%2C%2033%29%3B%0Aif%20%28uname%20%3D%3D%20%28strKey3%20+%20%28%28%28strKey1.toLowerCase%28%29%29.substring%280%2C%20strKey1.indexOf%28%220%22%29%29%20+%20strKey2.substring%282%2C%206%29%29.toUpperCase%28%29%29.substring%280%2C%2015%29%29%29%20%7B%0A%20%20%20%20var%20strKey4%20%3D%20%27Java_Scr1px_Pa4sW0rd_K3y_H3re%27%3B%0A%20%20%20%20if%20%28upass%20%3D%3D%20%28strKey4.substring%28strKey4.indexOf%28%271%27%2C%205%29%2C%20strKey4.length%20-%20strKey4.indexOf%28%27_%27%29%20+%205%29%29%29%20%7B%0A%20%20%20%20%20%20%20%20alert%28%27Login%20Success%21%27%29%3B%0A%20%20%20%20%20%20%20%20document.getElementById%28%27key%27%29.innerHTML%20%3D%20unescape%28%22%253Cfont%2520color%253D%2522%2523000%2522%253Ea2V5X0NoM2NrXy50eHQ%3D%253C/font%253E%22%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20alert%28%27Password%20Error%21%27%29%3B%0A%20%20%20%20%7D%0A%7D%20else%20%7B%0A%20%20%20%20alert%28%27Login%20Failed%21%27%29%3B%0A%7D"))
直接放到浏览器里运行,得到解码后的js
var strKey1 = "JaVa3C55pxIsAGo0DStAff"; var strKey2 = "CaNUknOWThIsK3y"; var strKey3 = String.fromCharCode(71, 48, 111, 100, 33); if (uname == (strKey3 + (((strKey1.toLowerCase()).substring(0, strKey1.indexOf("0")) + strKey2.substring(2, 6)).toUpperCase()).substring(0, 15))) { var strKey4 = 'Java_Scr1px_Pa4sW0rd_K3y_H3re'; if (upass == (strKey4.substring(strKey4.indexOf('1', 5), strKey4.length - strKey4.indexOf('_') + 5))) { alert('Login Success!'); document.getElementById('key').innerHTML = unescape("%3Cfont%20color%3D%22%23000%22%3Ea2V5X0NoM2NrXy50eHQ=%3C/font%3E"); } else { alert('Password Error!'); } } else { alert('Login Failed!'); }
直接在浏览器里运行,获得uname和upass
Uname = G0od!JAVA3C41PTISAGO Upass = 1px_Pa4sW0rd_K3y_H3re
中间那段混淆的代码解码后是
<font color="#000">a2V5X0NoM2NrXy50eHQ=</font>
解密base64得到key_Ch3ck_.txt,访问后再次得到Ch3ck_Au7h.php,接着向下访问提示username error,然后再url上加上刚才获得的uname和upass即可获得flag
Ch3ck_Au7h.php?uname=G0od!JAVA3C41PTISAGO&upass=1px_Pa4sW0rd_K3y_H3re
flag:{NSCTF_d7590edfdf8bcf958ced10cec94273ad}
6.social engeer
这题一开始各种网上查找信息,qq、微博、空间、查社工库,都没有找到任何信息。然后就放着了,最后一天的发现hint中有提示,是姓名+生日的中国式密码,然后就开始做字典,工具+脚本,一共差不多近100W行的字典,一个下午,又是噩梦般的爆破。终于里比赛结束还有一小时的时候爆破成功
密码:Xiaoming09231995
然后是一个手机号13588342951,毫不犹豫,发了短信
然而没有任何回复,身边的哥们直接打了过去,然后尴尬的一幕发生了,
“你好,你有flag么”
“你们是谁啊,怎么最近这么多奇怪的电话”
“额,,,不好意思,打错了”
看来手机号本人是个可怜的受害者,接下来接着查找手机号的信信,估计就是查找有关手机号信息泄露的问题,最后在开房信息中找到了身份证号
提交身份证号获得flag
flag:{NSCTF_3ad65730a8f203a5ab861169e9547f6}
7.LFI
本地文件包含漏洞,参考这篇文章
http://www.2cto.com/Article/201202/119215.html
post如下语句
file=php://filter/read=convert.base64-encode/resource=index.php&submit=%E6%8F%90%E4%BA%A4
可获得base64编码的index.php
解码后获得flag
flag:{NSCTF_9bac7a6e289bf89ee0061bd0abdef0ab}
8.SQL
Sql注入,一开始看到隐藏参数fitername,以为注入点在这
测试之后也确实有反应,但是只要出现select、sleep()等关键字就有sql inject警告,并且引号斜杠等字符也被转义了,接下来尝试绕过过滤机制,但是试了各种办法始终绕不过去,sqlmap也测试无果,就暂时放了下来。后来想了想fitername的含义,又测试了他的作用,可以过滤掉username中的某个字符串,然后想是否可以在username中添加干扰字符然后由fitername过滤这样绕过呢,于是测试了下,发现转义的问题没有解决,尝试url编码后成功绕过,然后开始测试之前的想法,尼玛成功了,最终构造如下payload获得flag
9.Decode
这题相对比较简单
密文:a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws
加密函数:
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($_))); }
对密文解密:
1.解rot13
n1mYotDfPRFRVdEYjhDNlZjYld2Y5IjOkdTN3EDNlhzM0gzZiFTZ2MjO4gjf
2.字符串反转:
fjg4OjM2ZTFiZzg0MzhlNDE3NTdkOjI5Y2dlYjZlNDhjYEdVRFRPfDtoYm1n
3.base64:
~88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg
4.逆向加密函数:
}77925d0af7327d30646c918bfda5d37b_FTCSN{:galf
5.再次反转:
flag:{NSCTF_b73d5adfb819c64603d7237fa0d52977}
10.Variable cover
好吧,这题是大牛提示的,某大牛说可利用sql做Variable cover。当时YY了很长时间没想到怎么利用,难道要读Variable cover数据库中的内容么?随后尝试了下没用成功,暂时放下了(去做逆向了,被bin牛逼得不行了)。后来发现Variable cover和sql这两题都是同一个端口,应该是在同一服务器甚至是相同的web目录,那么就可以尝试用load_file夸站读文件,构造如下payload获得web10的login.php源码
username=123%27+uniselecton+selselectect+1,loselectad_fiselectle(%27/var/www/fa81bb665474f11c025b5355582af315/web/10/login.php%27)%23filtername=select
flag:{NSCTF_adf0ff1eb152b1e3398ba4523fc713f}
11.File Upload
一看是上传,应该是考察上传绕过了。发现上传正常的文件可以上传,上传任何危险后缀的文件都会被加上的下划线,虽然都提示上传成功,但是实际访问时都不存在。然后有点不知道这题啥意思了,随后又开始测试一些其他后缀,当测试.php5的时候发现返回不一样,提示“上传成功,但是系统检测是非法文件,又立即删除了”。当时觉得这句话很多余,正常文件貌似也被立即删除了啊,如果是非法文件直接删除就好了,干嘛要提示呢。后来在一个群里看到一个人说了句“延时”,然后结合那个多余提示,题目可能是让我们在木马被删除之前访问,以获得一些信息。
这是考验手速嘛,于是拿出三杀的手速去访问,然而并没有什么卵用。毕竟这是400分的web题目,然后想写个脚本应该差不多,简单构造了python程序,上传后直接访问,可还是404界面。然后就以为思路错了。后来想到了Burpsuit,做了个10W行的全是1的字典,用他的intruder功能暴力上传1.php5,然后再访问,又是404。无奈只能强上了,又开了个intruder,加载10w行的字典,暴力访问1.php5。终于,终于出现flag了。
flag{NSCTF_8f0fc74ddf786103ed56d20af3bf269}
四、Reverse
1.100
第一题还是比较简单的,最然对于我这样几乎不碰逆向的人来说略显笨拙,但还是可以搞懂程序的意思。先用工具脱壳,在IDA打开后发现有一个循环,然后OD动态调试,查找字符串,找到两个flag字符串,显然那不是最后的结果
其中flag字符串所在的位置程序并没有运行过去,修改一个跳转,跳到flag的地方,然后再输出的地方下个断点,运行得到flag
flag:{NSCTF_md5712df97688fe0b7a399f076d9dc60437}
2.250
第二天用的方法几乎和第一题一样,将程序做个跳转,使其运行到flag的地方,然后就可以在寄存器里看到flag一步一步的生成了
flag:{NSCTF_md50b7dfc60761e798328a0d9793f96d4f7}
3.400
这是一个python编译成exe的程序,用工具pyinstxtractor可将其打回源码,然后找到这个文件Revesre03,直接打开是一段加密的程序
data = "x1cx7ax16x77x10x2ax51x1fx4cx0fx5bx1dx42x2fx4bx7ex4ax7ax4ax7b" + "x49x7fx4ax7fx1ex78x4cx75x10x28x18x2bx48x7ex46x23x12x24x11x72" + "x4bx2ex1bx7ex4fx2bx12x76x0b" ''' char buf[] = "flag:{NSCTF_md5098f6bcd4621d373cade4e832627b4f6}"; int _tmain(int argc, _TCHAR* argv[]) { printf("%dn", strlen(buf)); char key = 'x0b'; buf[47] ^= key; for (int i = 1; i < 48; i++) { buf[48 - i - 1] ^= buf[48 - i]; } return 0; } ''' print "Revese it?????????"
Flag是个假的,应该只是加密演示用的,估计data是真的flag,写个解密脚本,获得flag
data = " 1c 7a 16 77 10 2a 51 1f 4c 0f 5b 1d 42 2f 4b 7e 4a 7a 4a 7b" + " 49 7f 4a 7f 1e 78 4c 75 10 28 18 2b 48 7e 46 23 12 24 11 72" + " 4b 2e 1b 7e 4f 2b 12 76 0b" data = data.split() print data flag = "" for i in range(len(data)-1): #print int(data[i],16) flag+=chr(int(data[i],16)^int(data[i+1],16)) print flag
flag:{NSCTF_md540012655af49e803c68e165c9e5e1d9d}
有些图片上传后不清晰,不知道为什么,有什么问题留言就行了。