XCITC-CTF 官方WriteUp

MISC

签到

直接提交。。

image-20191202205048308

????

下载文件是一张图片

img

​ 发现图片下边有一行显示不完全的内容,这应该是图片隐写中的高度改变信息

img

​ 00这个位置的高度改变下

img

img

Tank

img

打开文本,发现是很长的一段编码,

解密前几位,发现是jpg文件头

找一张图片转码试一下

img

把文本内容加上头用base转码成图片

img

眼见非实

下载为文本文件,打开后发现开头为Rar

​ Rar压缩文件标准格式,

img

​ 将后缀改为rar,会看到flag.exe的可执行文件

​ 双击运行会发现闪退,用cmd窗口运行

img

千层套路

img

下载之后是一个txt文件,打开后发现有image/jpeg,猜测可能是复合文件

Binwalk一下

img

发现确实有隐藏文件

分离文件,发现有个secret.pcap文件,拖进wireshark分析

img

img

发现可疑,516GET,右键>追踪流>追踪tcp流

在下边发现base64转码后的图片编码

img

进行解码(这里建议写脚本,从网上解码下来的图片可能会进行二次渲染)

脚本

img

img

没有信息

再次binwalk

img

发现rar文件,分离

在歌曲中的标题内容为base64 解密后得到key

KEY{You_are_stupid}

为压缩包密码,解压缩后得到flag

(此处省略Flag)

Web

HelloWorld

clipboard.png

打开之后看到一个弹框。

点击确定后显示一个图片背景。

这时候F12查看源代码

clipboard.png

看到一个注释的flag.txt

构造url :http://39.105.140.214:20010/flag.txt得到flag

clipboard.png

Web2

打开网址得到代码

clipboard.png

然后进行代码审计由于下面的逆向加密算法就可以的到flag

于是可以写脚本来跑这个加密算法。

脚本思路:

第一步:将miwen进行rot13解码

第二步:将rot13解码得到的字符串进行反转

第三步:反转过后的字符串进行base64解码

第四步:chr(ord 将字符串中的每个字符转为相对应的ASC码并减一)

第五步:在进行一次字符串反转

即可得到flag

下面是我写的脚本:

clipboard.png

得到flag

clipboard.png

Web3

打开看到一个验证

clipboard.png

一个简单的加法运算题

口算出结果后输入发现只能输入一个字

F12 查看源码

clipboard.png

发现最大长度为1

改成大于结果的长度即可得到flag

clipboard.png

域名查询

打开题目所给url出现了如图所示代码:

clipboard.png

开始进行代码审计

REQUEST 是一种传参方式

然后接着审计代码可以看到要上传一个IP 所以可以输入127.0.0.1尝试一下。

clipboard.png

可以看到输入了127.0.0.1 之后返回的。

接着再往下看代码,发现了下面那些,发现输入这些符号都被转为空值了。试一下:

clipboard.png

接下来我们就要想着怎么样去绕过这些来得到我们最终想要的flag

往下面看看到了nslookup 这个命令,

这个命令是用来查询DNS的记录,查询域名解析是否正常。

开始想办法绕过,%0a 是url 编码过的换行

clipboard.png

这样是的不到东西的,因为已经被转换为空了

可以通过%0a进行绕过 用ls 查询一下

clipboard.png

发现flag.php

用tac 查询flag.php 的内容得到flag

clipboard.png

LFI

打开网址可以看到

clipboard.png

点击之后发现并没有flag

clipboard.png

此时看到url为?file=hint.html

看到file=可以想到Php中的文件包含

可是除此之外并未有其他信息

老样子F12

看到一个robots.txt

clipboard.png

进入robots.txt

clipboard.png

看到了不想让你们看到的信息,此时看到了flag.php

然后访问一下

clipboard.png

发现什么东西都没有出来。

此时想到刚刚的文件包含,是让我们读取flag.php的源代码。

于是开始构造payload

?file=php://filter/read=convert.base64-encode/resource=./admin/shell/flag.php

读取到flag.txt的源码

clipboard.png

不过此时得到的是经过base64加密过的源码,接下来将这一串base64进行解密即可得到flag.php源码

clipboard.png

得到flag

Reverse

签个到吧

Reverse

这里让输入正确的密码然后进行判断

直接打开ida

img

发现v4是我们输入进去

的密码,与v5进行了判断,由此可知v5就是中存放的就是我们的flag

v5 = (const char *)flag();

这一行会发现 v5的值是flag()这个函数返回的值点进去看一下

img

然后会发现几串数字,在ida中r键可以将数字转化成他们的ascii

转化之后会发现这样的,因为小端字序的原因,这串字符是每4个byte一组倒过来的。将其反转

flag{jiitaimei}

TestCode

打开是很经典的输入判段img

这里直接用ida打开

发现有一串很像flag的东西

然鹅,他是fake_flag(假的)

然后发现重要函数dec()

img

这里enclist是一个数组,这里要注意数组一般是从0开始,这里是从1开始

memset(encList, 0, sizeof(encList));

这个是吧0写道enclist的第一位

循环的是将,enclist的第i位与4*i的异或运算再和key[]的第i位进行异或

下面是脚本

encList=[0,4,8,12,16,4,68,31,39,20, 39, 60, 27, 57, 52, 57, 122, 80, 90, 66, 106, 92, 14, 66, 109, 103, 104, 108]
key='flag{Good_but_is_fake_flag}'
flag=''
for i in range(27):
flag+=(chr((encList[i]^(4*i)^ord(key[i]))))
print(flag)

RE_BASE

查看文件为64位elf linux可执行文件,运行输入字符串 返回一个值,

image-20191202213929723

IDA查看,来到main函数

image-20191202214137054

发现没有pdb表,大概内容是将用户输入的值和ZmxhZ#tiYXNlNjRfRjRubnl(做了比较,期间输入的内容在sub_92a处进行了运算,第一个参数为我们输入的内容,第二个参数为长度,第三个参数是预设值。

image-20191202214338021

观察函数,进行一些特征判断,发现是base编码,

image-20191202214410692

通过交叉引用的方式,得知是base64变异,编码表被替换了,需要重改编码表进行解密,

#include 
#include 
#include 

const char _Base[]={"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz)!@#$%^&*(+/="};

char * Decbase64(char * orgdata,unsigned long orglen)
{
  char *p,*ret;
  int len;
  char ch[4]={0};
  char *pos[4];
  int  offset[4];
  if (orgdata==NULL || orglen==0)
  {
      return NULL;
  }
  len=orglen*3/4;
  if ((ret=(char *)malloc(len+1))==NULL)
  {
      return NULL;
  }
  p=orgdata;
  len=orglen;
  int j=0;

  while(len>0)
  {
      int i=0;
      while(i<4)
      {
          if (len>0)
          {
              ch[i]=*p;
              p++;
              len--;
              if ((pos[i]=(char *)strchr(_Base,ch[i]))==NULL)
              {
                  return NULL;
              }
              offset[i]=pos[i]-_Base;

          }
          i++;
      }
      if (ch[0]=='='||ch[1]=='='||(ch[2]=='='&&ch[3]!='='))
      {
          return NULL;
      }
      ret[j++]=(unsigned char)(offset[0]<<2|offset[1]>>4);
      ret[j++]=offset[2]==64?'\0':(unsigned char)(offset[1]<<4|offset[2]>>2);
      ret[j++]=offset[3]==64?'\0':(unsigned char)((offset[2]<<6&0xc0)|offset[3]);
  }
  ret[j]='\0';
  return ret;
}

int main(int argc,char *agv[])
{
  unsigned long nlen;
  printf("%s\n",Decbase64("ZmxhZ#tiYXNlNjRfRjRubnl(",strlen("ZmxhZ#tiYXNlNjRfRjRubnl(")));
  return 0;
}

image-20191202215302689

Crypto

滴答!滴答!

将滴转换为-

将嗒转换为.

得到: -- ----- .-. ... . -.-. --- -.. .

image-20191202212438726

加上flag{}即为答案

佛说

百度与佛论禅 直接解码。

image-20191202212131863

扑朔迷离

密文:Rabbit密码,去掉了头U2FsdGVkX1,加上即可

key :两次md5加密后 得到的一串值,解密后为admin

image-20191202211853236

base

打开看到大量的base64编码,使用递归的方法,在32次解密后即为答案

import base64
f=open("./enc.txt","r")
cipher = f.read()
f.close

def dec(en,n):
    if n==1:
        return en
    en = base64.b64decode(dec(en,n-1))
    return en

print dec(cipher,32)

ezRSA

已知密文,N和e

由N可以分解得出p,q

1575251268356

P23 = 73011633012107403650963
P23 = 56898061770151570660943

得到p q的值为73011633012107403650963,56898061770151570660943

已知pq 可以求出私钥d

然后通过已知密文,私钥和N 可以求出明文

import libnum  
from Crypto.Util.number import long_to_bytes  

c = 0x346644dfe4c826c07a0ee6e0b2e10862d41aa8
n = 4154220405062524632278989171077190153188438109
e = 0x10001
q = 56898061770151570660943  
p = 73011633012107403650963

d = libnum.invmod(e, (p - 1) * (q - 1))  
m = pow(c, d, n)  
print m
print "plaint = ",
print long_to_bytes(m)

得到的明文转为文本即为flag

image-20191202095348152

flag{RSA_One_chall}

BabyEncode

QQ图片20191202210943

打开之后分析代码。

这是在循环中将flag中的第i个字符的ascii数与flag的长度进行异或,将异或的结果加一在转成字符

放入enc中

最后将enc的值进行base32编码然后字符串反转,在进行编码

import base64
key = 'PR3VYYLTGZVVOYDRNRWWC2A='
def Decode(value):
    enc =''
    flag=''
    enc = (base64.b32decode(key))[::-1].decode()
    for i in range(len(enc)):
        flag += chr(ord(enc[i])^len(enc)-i)
        print(flag)
    return flag
Decode(key)

get flag

发表评论

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