NSCTF Writeup

这次比赛感觉学习到的东西挺多的,感触最深的一点想我这样的做web不得不去做逆向了,虽然略懂一点逆向知识,但也仅限于IDA查看源码分析算法,并不会复杂的调试。MiscCrypto还算简单,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-ipX-Forwarded-ForReferer与火星的各种的组合,真是膝盖碎了一地。后来提示说本地访问,试了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参数了,又开始了噩梦的般的尝试,adminadministratorxiaoheidahei12345…………终于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!');
}

直接在浏览器里运行,获得unameupass

 

Uname = G0od!JAVA3C41PTISAGO
Upass = 1px_Pa4sW0rd_K3y_H3re

中间那段混淆的代码解码后是

<font color="#000">a2V5X0NoM2NrXy50eHQ=</font>

解密base64得到key_Ch3ck_.txt,访问后再次得到Ch3ck_Au7h.php,接着向下访问提示username error,然后再url上加上刚才获得的unameupass即可获得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,以为注入点在这

测试之后也确实有反应,但是只要出现selectsleep()等关键字就有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

好吧,这题是大牛提示的,某大牛说可利用sqlVariable cover。当时YY了很长时间没想到怎么利用,难道要读Variable cover数据库中的内容么?随后尝试了下没用成功,暂时放下了(去做逆向了,被bin牛逼得不行了)。后来发现Variable coversql这两题都是同一个端口,应该是在同一服务器甚至是相同的web目录,那么就可以尝试用load_file夸站读文件,构造如下payload获得web10login.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}

有些图片上传后不清晰,不知道为什么,有什么问题留言就行了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*