CUMTCTF2017入门赛-Aegis writeup

Basic

签到题 10
根据题目,百度得知,使用本地hosts文件进行域名解析。(虽然用hosts翻过墙,但并不知道原来是这么一回事)

WIN10 hosts目录:C:\Windows\System32\drivers\etc
添加如上字段即可。再刷新DNS即可。


encode 10
题目如图:

分析只可能是jsp混淆或者jjencode/aaencode加密(不确定)。
使用chrome/firefox自带的控制台即可自动解密。


滑稽 20
下载并打开ppt文件。发现ppt只有一页,猜想flag被隐藏在图片背后。

但是ppt无法编辑,尝试启动编辑。发现有密码:
由于ppt格式类似于zip压缩包。更改文件后缀名,得到huaji.zip
在以上路径找到3张图片。分析知image3.png有问题。之后启动16进制文本编辑器。

由此得到密码,但是密码经过Base64加密(有2个等号的特征)。之后解密得真正的密码。

现在ppt可以编辑了,移动最上层的图片。可以发现flag。


Fast 30
进入网页之后发现要在两秒内提交key。

随后在消息头中找到flag,尝试提交后并不是答案。

又发现因为要在2s内提交,故编写python脚本如下,得到flag。

—————————————————————————————————————————————————————-

MISC

LSB 30

由于题目提示了隐写的类型为LSB。故使用Stegsolve工具帮助分析。
由典型文件头,保存以上数据为png文件。
由此得到一个二维码。

扫描该二维码即可得到flag。


视而不见 50
由题目知是一张3D图片。Flag隐藏在图片中。开始尝试用photoshop分析,但是失败了。之后用StegSolve打开,选择Stereogram Solver。

最终找到flag。


鲨鱼的套路 70
用wireshark打开后,根据hint查看TCP流。

找到如下信息。

UEsDBBQAAAgIANeFfErNFL6kGwAAABsAAAAcAAAAaGludF9zb21lIF90aGluZ19pc19mYWtl
LnR4dEvLSUyvTs5IzUuPL87IjC9JzI/PKQUyU/NqAVBLAQI/ABQACQAIANeFfErNFL6kGwAAABsAAAAc
ACQAAAAAAAAAIAAAAAAAAABoaW50X3NvbWUgX3RoaW5nX2lzX2Zha2UudHh0CgAgAAAAAAA
BABgAu7Ux1J+n0gGhDeAnl6fSAaEN4CeXp9IBUEsFBgAAAAABAAEAbgAAAFUAAAAAAA==
分析知是base64加密,对其解码成十六进制得到。
50 4b 03 04 14 00 00 08 08 00 d7 85 7c 4a cd 14 be a4 1b 00 00 00 1b 00 00 00 1c 00 00 00 68 69
6e 74 5f 73 6f 6d 65 20 5f 74 68 69 6e 67 5f 69 73 5f 66 61 6b 65 2e 74 78 74 4b cb 49 4c af 4e ce
48 cd 4b 8f 2f ce c8 8c 2f 49 cc 8f cf 29 05 32 53 f3 6a 01 50 4b 01 02 3f 00 14 00 09 00 08 00 d7 85
7c 4a cd 14 be a4 1b 00 00 00 1b 00 00 00 1c 00 24 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00
68 69 6e 74 5f 73 6f 6d 65 20 5f 74 68 69 6e 67 5f 69 73 5f 66 61 6b 65 2e 74 78 74 0a 00 20 00 00
00 00 00 01 00 18 00 bb b5 31 d4 9f a7 d2 01 a1 0d e0 27 97 a7 d2 01 a1 0d e0 27 97 a7 d2 01 50
4b 05 06 00 00 00 00 01 00 01 00 6e 0。0 00 00 55 00 00 00 00 00
由文件头知是明显的zip压缩包格式。保存为zip格式,尝试打开包。发现有密码。打开16进制文本编辑器。

其中发现存在伪加密,将光标处的9改成0保存,打开即得到flag。


easy crypto 70
打开文件后发现两个txt。

两个都打开后,发现morse.txt中明显是摩斯电码。随后解码如图。

Key is vigenerecipher意为维吉尼亚,即知道flag是维吉尼亚密码加密。

解密便得到flag。


学姐真美 120
开始并没有什么思路,之后放出hint :图片中存在另外一张png图片。随后打开16进制文本编辑器。

发现在图片最后,即0xffd9之后,出现了典型的png文件头格式(被修改了部分)。

搜索资料得知(上图为正确的png格式文件头)。
由此将0xffd9之后的数据分离出来。修改部分文件头,得到一个png图片。

发现是一个不完整的图片,猜测是二维码。根据提示,再次对照png文件头,可能是认为修改了图片长宽导致显示不正确。

再次查找资料,手动修改文件头。0x10开头为宽和高,因为是二维码,改成相同即可。

扫码即可得pass。

—————————————————————————————————————————————————————-

WEB

源代码 10
查看源代码最后一行,把文字删除即是flag。


请多多“包含”! 100
打开后发现file=page,明显的文件包含题。

查看想要看的代码file=php://filter/read=convert.base64-encode/resource=index.php

注解:
1.php://filter/可用于处理打开的数据流,起到过滤作用。如果源文件为.php则很有可能在前台显示不出来。
2.此时我们采用的方法是,先让文件转化为base64格式(convert.base64-encode)然后再输出,这样不论是什么格式的文件都可以在前台输出。
输入后将Base64解码得到flag.


世界上最好的语言 100

php代码审计
要使输入的hash与key的md5解码相同,且存在unserialize反序列化,根据类构造实例。

但因为要绕过__wakeup(),所以百度后可知将
O:4:”Cumt”:1:{s:3:”key”;s:8:”flag.php”;}
改成:
O:4:”Cumt”:2:{s:3:”key”;s:8:”flag.php”;}
并与hash值一起提交,即可看到flag。

—————————————————————————————————————————————————————-

MOBILE

Gift 10
由于是安卓题,使用androidkiller打开apk文件。但是并不懂smali语言(其实java也不懂)。

无奈下直接利用工具反汇编apk。在包中找到明码flag。


Hide&Seek 100
开始并没有什么头绪,直到给出hint,运用了最基础的图片隐写。便直接分析apk包中的图片。

发现这样两个图片,为logo,纯粹猜测logo_.png有问题(因为打不开)。
用16进制文本编辑器分析,在最后一行出现异常:

尝试以flag{0HY0VFINDM3}进行提交,成功。。。

—————————————————————————————————————————————————————-

Reverse

Easy_CrackMe 50
把程序下载下后,从初次运行可以看出是一个Win32 GUI平台。

拖进IDA中查看,主函数(入口地址)如图:
左侧可以看到很多函数,但看到主函数只调用了DialogBoxParamA一个函数(参数如下)
DialogBoxParamA(创建窗口){
hInstance是当前应用程序的实例句柄。
lpTemplateName是对话框的资源模板。
hWndParent是父窗口的句柄。
lpDialogFunc是对话框的消息处理函数。
dwInitParam是初始化参数。
}
可知,只有lpDialogFunc是消息处理函数,即输入对话框中的值(消息)只和该函数有关。

跟进DialogFunc,该函数只调用了sub_401080(地址为0x401080处的函数),再次跟进。
第一部分:
首先调用了GetDigItemTextA的API函数(进行输入),注意传参顺序。Mirosoft采用stdcall即标准调用规则。参数由右向左依次push,显然IpString为输入的值(形参),即eax。

而在push eax 之前 由lea指令取String变量的地址,所以String为输入值(实参),
再看变量的定义,可以发现有4个变量,图中表示距离某个基址(ebp)的偏移量,所以:String,var_63,var_62,分别为1,1,2个字节。

之后便是这句:cmp指令,比较前后两个值是否相等(简单理解就是var_63与a是否相等),jnz表示若不相等则跳转道loc_4001135处

不用说,看字符串就直到,incorrect,密码不对。所以var_63=a

第二部分:

显然是push3个参数后调用strcmp函数进行对比,比较长度2字节,这与上面推导的var_62有2字节相同,所以 var_62=5y(不然又会显示incorrect)。
第三部分:

又有明文出现,猜想又是比对。但之后汇编逻辑比较复杂,至此祭出F5神器。

显示了整个该函数的逻辑,其中关键的一句:

显然当所有条件满足的时候,调用messagebox函数(即输出对话框,显示congratulations)。
分析可知即字符串由a,5y,R3versing ,E构成,同时验证上述汇编级别的分析正确性。
对比这两部分。


根据偏移量可以得出 输入字符串由String+var_63+var_62+var_60组合而成,
将这几部分组合起来,即得到了Ea5yR3versing,即为flag。
Ps:不习惯汇编可以直接看F5反编译代码。


KeygenMe 100
运行知,本题为win32控制台程序,相对第一题没有众多apl函数,结构更清晰。
直接F5查看伪C代码,其中重要的逻辑为:

其中sub_4011B9显然是一个类似print的函数,那么第一部分:
先输入值到v9,再把v9经过异或运算后赋值给v13。

i>=3时候i=0就是i%3的运算,
但是v6+i表示的又是什么呢?
参看变量定义,可以知道v6,v7,v8为1个字节,v6+1即v7,v6+2即v8

所以得到:V13[i]=v9[i]^v6[i%3];
第二部分:再次输入一个变量的值。

下面就进行判断,如果v9和v13相等则输出congratulations,flag正确。

即V13[i]=v9[i]^v6[i%3] 和5B,13,49,77,13,5E,7D,13进行对比
所以将Serial转成十进制后,编写脚本(不会python,只能用c++)

为flag的十进制数字,再转成char即得到flag。


MAZE 200
根据下载的文件,打开分析,应该是用C++写的一个程序,找到主函数的入口。

在经过一些初始化后,发现主函数调用了2个重要的函数,于是跟进到f1。

显然该函数,使用rand()构造随机数,但是是伪随机数,每次生产的table都是一样的,从上述过程来看,hang+=15即代表table中的点往下移动一格,而lie++则表示table中的点往右边移动一格。table的大小为15*15。


第二部分:
接着跟进到f2函数,看起来运算比较复杂。又创建了一个desk,同样是15*15。
其实所有的类似于byte_404530的字节变量都是f1函数中的构造table中的每一个点。

一次循环创建5个点,lie+=5往右边移动5个点;hang+=15则是点往下移动一格。
得到的表如图所示:

之后主要在主函数中进行分析。

可以看到,v11为输入的值,v11+v6为输入的每一个值。
While循环确定的是当每一个值为0x49,即字符1的时候,++lie,即向右移动一格。
当值是0x50的时候,lie+=15,即向下移动一格。
注意看LABEL_9部分:每次处理完输入的值之后,将值赋给v7,而lie是从0开始的,也就是说v7变量表示的是走过的路径:
例如:

2112212112222221112112122111序列表示我输进去的值,而下面从0F开始的值,容易发现,从0F-E0,一共225,即一共走了225步,或者说从desk[0][f]-desk[e][0]。

但其实入口地址还没有呈现,即迷宫的入口在哪里。
其实无论你输进去什么值,程序默认都会打印出走的路径,注意到:

第一部分都会输出00。下面的while循环就是在打印之后的路径,所以,迷宫入口即为desk[0][[0]。
这时候就会发现,为什么一个二维迷宫只有2个方向键控制,因为是从左上角到右下角。
根据给的路径,只需要往下和往右就行了。

由于行列大小不一样,看起来有点奇怪,不是正方形。(0为墙,1为路)。
最后将得到的路径MD5(32位)之后,改成大写即为flag。

—————————————————————————————————————————————————————-

PWN

盲打(笑) 50
根据题目在命令行中进行远程通信nc 202.119.201.199 28888。
然后根据提示进行输入,当长度不够的或长度过长的时候都有提示。
当长度接近的时候慢慢试。。。
最后长度确定后,提示更改最后4个字节,猜想是flag,于是得到flag。
(赛后端口好像挂了,所以没有截图。)


Introductory Chapter 120
这道题给了文件,下载下来,发现是栈溢出,浏览程序,发现只要将eip调用到此处即可:

注意到一下几个步骤,所以buf的位置为rbp-30h,

考虑到push rbp 产生的8个字节,实际要覆盖rip需要38h个字节,首先,为避免栈的不平衡,先输入48个字节的值观察:


其中00007FFD0CF56050为保存的rbp值,00007FFD0CF56058为rip返回值,上图说明想法基本正确。下面考虑如何改变rip。

主要到00000000400716为获取flag的函数,根据小段格式,输入的值应该为:

\x16\x07\x40\x00\x00\x00\x00\x00。
因此试用python写出脚本,即得flag。(第一次成功做出pwn >_<)

—————————————————————————————————————————————————————-

剩下的题都不会做了,总和的writeup:CUMTCTF2017入门赛Writeup

posted @ 2017-04-11 21:39  有利x  阅读(828)  评论(1编辑  收藏  举报