ISCC2015 writeup

ISCC2015刚刚结束,自己也水了一把,做了一些题目,这里整理一下我的做题思路还有一些别的writeup,和大家分享一下,本题中的部分题目和一些工具以及官方的writeup将打包发给大家。

题目和工具:http://pan.baidu.com/s/1o6xaU50  密码:32ku

官方writeup:http://pan.baidu.com/s/1pJC7ZCZ  密码:5ivy

BASIC

BASIC的题目比较简单,都是一些基础知识的考察,大多通过百度、Google就可以查到。

0x01 Basic01(67px) easy?

密文mzdvezc是用仿射函数y=5x+12加密得到的,试对其解密。

根据仿射加密的规则,字母a~z与数字有如下对应关系

a b c d e f g h  i  j  k   l   m  n  o   p   q   r   s   t   u   v   w  x   y   z
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

求得其解密函数为  x=21(y-12)%26 

将密文mzdvezc代入,即可得flag:anthony

0x02 Basic02(67px) 神秘纸条

求解如下密文

pHBP018DCCh/KTe6Psz1/g

Lo1tv5ESqHnUzrFUA9EKeA

mpftptifXJ6EVgRooGeXBw

pHV9dBn/O0jpLpBZbw51SA

Ypm6LL2WYaXjhytxVSHNag

一开始也不知道这是什么编码 (后来得知这是base64(hex(md5))),隔了很长时间,决定翻墙google试试,搜出了几个结果,google就是比百度强大,百度只有一个搜索结果!!!其中这个网站里是一个编码字典:http://mina.naguib.ca/dist/digest里面就有题目给的编码类型。但是数量太多,于是下载下来,写个脚本本地查找

Python 代码:

#-*-coding:utf-8-*-

import os
import os.path
import sys
mydir = r"C:UsersAdministratorDesktopdigest-all" 

data=['pHBP018DCCh/KTe6Psz1/g','Lo1tv5ESqHnUzrFUA9EKeA','pHV9dBn/O0jpLpBZbw51SA','Ypm6LL2WYaXjhytxVSHNag','mpftptifXJ6EVgRooGeXBw']
#k = open('key.txt','w')  
for parent,dirnames,filenames in os.walk(mydir):
    for filename in filenames:
        f = open(r"C:UsersAdministratorDesktopdigest-all\"+filename,'r')
        for line in f:
            if data[0] in line or data[1] in line or data[2] in line or data[3] in line or data[4] in line:
                print line
f.close()
#k.close()
                 
print 'Done!'

结果如下:

pHBP018DCCh/KTe6Psz1/g  The
Lo1tv5ESqHnUzrFUA9EKeA  death
mpftptifXJ6EVgRooGeXBw  eat
pHV9dBn/O0jpLpBZbw51SA god
Ypm6LL2WYaXjhytxVSHNag only

开一下脑洞,组合成一句话:The death god only eat

提交后发现不对,经爱看动漫的同学提示,flag为apples

0x03 Basic03(133px) 恶作剧or机密

一个加密的docx文档,直接爆破即可,密码是hj7k,比较坑的是一开始没给hint,不知道爆破的范围,试了很长时间没出结果,后来说密码只有四位,终于爆破成功。

flag:duang2015duangda

0x04 Basic04(200px) Decrypt

密文
22, 09, 00, 12, 03, 01, 10, 03, 04, 08, 01, 17
是使用如下的Hill密码加密的:
     1     2     3
     4     5     6
     7     8    10

试破解它。

这题直接百度,搜到了一篇paper,讲的是原题

首先将加密矩阵放入变量K。
>> K=[1 2 3;4 5 6;7 8 10]
K =
     1     2     3
     4     5     6
     7     8    10
然后,求解密矩阵,即求逆矩阵并mod 26:
>> format rat  %使用有理数格式
>> Kinv=inv(K)
Kinv =
    -2/3         -4/3           1      
    -2/3         11/3          -2      
      1           -2            1   
>> K1=Kinv*3
K1 =
     -2           -4            3      
     -2           11           -6      
      3           -6            3   

>> K2=round(mod(K1*9,26))
K2 =
      8           16            1      
      8           21           24      
      1           24            1      
K2是矩阵K mod 26的逆矩阵,能按如下方法检验:
>> mod(K2*K,26)
ans =
      1            0            0      
      0            1            0      
      0            0            1    
下面是利用解密矩阵K2进行破解:
>> mod([22, 09, 00]*K2,26)
ans =
     14           21            4    
>> mod([12, 03, 01]*K2,26)
ans =
     17           19            7      
>> mod([10, 03, 04]*K2,26)
ans =
      4            7            8      
>> mod([08, 01, 17]*K2,26)
ans =
     11           11           23      
因此,明文是14 ,21,4,17,19,7,4,7,8,11,11,23。可以还原回原来的字母:
>> int2text([14 ,21,4,17,19,7,4,7,8,11,11,23])
ans =
overthehillx

这里是用MATLAB做的,矩阵的东西用MATLAB处理确实比较方便

flag:overthehillx

0x05 Basic05(200px) 蛛丝马迹

题目给了一段hex,并给出异或加密的密匙0x42,异或解密后在xp系统下用VC6.0运行shellcode,成功弹出flag,其他的环境我都没测试成功。。。

shellcode测试代码

unsigned char shellcode[] =

"x90x90x90x90x90x90x90x90x90x90"

"xd9xebx9bxd9x74x24xf4x31xd2xb2x77x31xc9x64x8b"

"xfcx68x6axax38x1ex68x63x89xd1x4fx68x32x74x91xcx8bxf4x8dx7exf4x33xdbxb7x4x2bxe3x66xbbx33x32x53x68x75x73x65x72x54x33xd2x64x8bx5ax30x8bx4bxcx8bx49x1cx8bx9x8bx69x8xadx3dx6axax38x1ex75x5x95xffx57xf8x95x60x8bx45x3cx8bx4cx5x78x3xcdx8bx59x20x3xddx33xffx47x8bx34xbbx3xf5x99xfxbex6x3axc4x74x8xc1xcax7x3xd0x46xebxf1x3bx54x24x1cx75xe4x8bx59x24x3xddx66x8bx3cx7bx8bx59x1cx3xddx3x2cxbbx95x5fxabx57x61x3dx6axax38x1ex75xa9x33xdbx53x68x77x76x74x26x68x56x6bx2ax38x8bxc4x53x50x50x53xffx57xfcx53xffx57xf8x90x90x90x90" // 放上你自己的shellcode开始调试吧

"xfcxacx84xc0x74x07xc1xcfx0dx01xc7xebxf4x3bx7c"

"x90x90x90x90x90x90x90x90";

int main()

{
      int nMethod = 4;
      switch(nMethod)
      {
      case 1:

           {
                 // 1、方法一,使用push ret指令序列
                 __asm

                 {
                      lea eax, shellcode
                     push eax                         // ShellCode地址入栈
                      ret                                   // 这里会直接返回到shellcode去执行
                 }
           }
           break;
      case 2:
           {
                 // 2、方法二,直接使用call指令
                 __asm
                 {
                      lea eax, shellcode
                      call eax                                 // 直接去call这个地址
                 }
           }
           break;
      case 3:
           {
                 // 3、方法三,强制转换为一个函数指针再调用
                 ((void(*)(void)) &shellcode)();
           }
      case 4:
           {
                 // 4、方法四,使用jmp指令
                 __asm

                 {
                      lea eax, shellcode 
                      jmp eax
                 }
           }
          break;
      default:
          break;
      }
      return 0;
}

flag:Vk*8wvt&

WEB

0x01 Web01 (267px) What should you do now?

查看JS:

var chr = "1311|1337|1357|1294|1325|1337|1333|1340|1325|1347|1353|1350|1313|1341|1346|1336|"; 
  var str = ""; 
  function a( arg ) 
  { var i,k; i = ""; 
   for( k = 0; k < chr.length; k ++ ) 
   { 
     if( chr.charAt(k) == '|' ) 
           { 
        i -= arg; 
        str += String.fromCharCode(i); 
        i = ""; 
      } else 
      { 
        i += chr.charAt(k); 
      } 
   } 
  } 
  function b() 
  { 
    str = ""; 
    a( pass.value ); 
    alert( str ); 
  }

KEY就隐藏在这段数字字符串中,根据题意,就是这些四位数减去输入的一个4位数,再取ascii即可,写个小脚本爆破:

import sys

num = [1311,1337,1357,1294,1325,1337,1333,1340,1325,1347,1353,1350,1313,1341,1346,1336]

for l in range(1150,1246):
    num2 = []
    for i in num:
        num2.append(i-l)
    for i in num2:
        print chr(i),
        sys.stdout.softspace=0
    print 'n'

flag:YeahYourMind 

0x02 Web02 (333px) How?

在请求头信息中看提示的SQL语句

找到了一篇paper  http://www.tuicool.com/articles/uYrmYv  直接用原题的payload即可

flag:{45dcbc39e5596ffbb0d09dd3e2bde0fa}

MISC

0x01 MISC02(400px) Godlike

pcap数据包分析,设置过滤规则
http and ip.src==172.16.160.128
可以看出这是对一个webshell的抓包过程,查看post数据包,在第28745个数据包中找到一段可疑数据,里面是一个zip压缩包。复制出来保存为zip文件,但是有密码,无法打开。数小时爆破后感觉情况不对,应该还有别的线索。突然想起在某个数据包里有webshell执行的解压zip文件的命令,其中就有一个pass。
解压密码为havefun,解压得flag
flag{ce8c136df237e86bb7a553347f}

0x02 MISC03(400px) 道之道

这是bmp图片的隐写,bmp图片是由像素点组成的,一个像素点是一个RGB三色的数组,一个颜色也称之为通道,每个通道由8个二进制组成,所以24位的位图可以有2的24次方中颜色变,它的每一位二进制都可以隐写数据。使用图片处理神器stegsolve查看每一位的信息,发现有异常数据

将这些数据拼接起来构成一个加密的zip文件,其中文件末尾的782ppp2o0r068q7s进行Rot13编码即可解密
flag:{40a4156965b782efb4f574c5d0cf219a}

0x03 MISC05(467px) 细节决定成败

这是一个png图片,不过要修复一下头信息才可正常显示。然后尝试了这种办法找不到线索,突然想起AppLeU0's Blog里写的一篇隐写术,用pngcheck查看png数据块IDAT,果然最后的数据块中有异常,最后一个快的值不满65524,但并没有合并到倒数第二个IDAT块。

将其抠出来,其数据头是78 9C开头,这是zlib压缩的标志,所以将其数据部分的16进制复制下来进行解压,倒数后四位是crc校验码,不用复制。实际的数据为:
789C4BCB494CAF0EF0738FF774710C89F7893237378FCF2A2D2E49CB2F4A2BCDAB0500AE010B58

用Python进行zlib解压:

import zlib
import binascii
IDAT = "789C4BCB494CAF0EF0738FF774710C89F7893237378FCF2A2D2E49CB2F4A2BCDAB0500AE010B58".decode('hex')
result = binascii.hexlify(zlib.decompress(IDAT))
print result

运行结果:
666c61677b504e475f494441545f4c5a3737375f6a757374666f7266756e7d
再将其作为16进制数据复制到winhex中得flag
flag{PNG_IDAT_LZ777_justforfun}

发表评论

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

*