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}