Perenial youth.

CTF划水记

CTF划水记

第一次参加了CTF(夺旗赛,有点像网络安全领域里的ACM)。因为是在我们学校举办的,报名的时候也就抱着划划水的态度,没有准备和了解的情况下就做了(这样很不好) 。虽然只A了几道签到题,但好歹是这个方向的第一次尝试,感觉也挺有意思的,所以回忆了一下做了的几道题目。因为比赛结束网站已经进不去了,所以题目就简单描述一下,主要是记录一下自己当时的思维过程。

1.SQL注入

sql注入是信息安全竞赛很常见的题目,据我看了几条blog的浅薄经验来说,关键是用户输入的文本需要由后端通过字符串拼接成SQL语句,这里字符串的拼接就可以做文章。本题网页需要用户在文本框中输入1或者2,然后网页会return查询结果。那么首先,我们要确认后端sql语句的类别——因为可能是select * from table where gid = 1 或者 select * from table where gid = ‘1’ 或者 select * from table where (gid = 1) 或者
select * from table where (gid = ‘1’ ) 几种情况。这里首先在return 的url的gid = 1后加上’,网页报错,然后再在gid = 1’后加上%23,即#号(为什么不直接用#是因为浏览器有特殊的机制过滤#),网页正常return,说明需要闭合单引号,即后端的sql语句形式是 select * from table where gid = ‘1’ .

再判断注入的行数。使用order by,发现order by 5时,无回显,order by 4时有回显,所以后端返回列数为4.再使用 gid=0’ union 1,2,3,4# 返回顺序如下图:

再查找当前数据库名,当前用户名以及当前sql版本号:
gid=0’ union 1,database(),user(),version() #,结果如下 :


再查找当前数据库的所有表名:
gid=0′ union select 1,2,3,(select group_concat(table_name) from information_schema.tables where table_schema=database())# :

注入出flag表的列名 :
gid=0′ union select 1,2,3,(select group_concat(column_name) from information_schema.columns where table_name=’flag’)#
直接找到列名为flag的列return结果 :
gid=0′ union select 1,2,3,(select flag from flag)%23

2.BASE64+JSFUCK

给定一串字符串需要解密;这里是一串长字符串,我看了一下,由大写字母和数字组成,然后呈现高度重复的状态,但不是完全重复;因此我猜测这是某一种二次加密。如果是一次加密的话,难以出现只由部分字符(大写字母,数字)形成的高度重复的字符串。查找了一下相应的密码学算法,发现常用的长串字符串编码有:base64, base32, base16, brainfuck, jsfuck等; 其中它们都有各自的字符串组成要求: base64
可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符; base32可打印字符
大写字母(A-Z)和数字234567 ;brainfuck和jsfuck的字符都有高度的重复性,但是只由<>+[]等特定字符组成。因此大概率猜测所给字符串是base64编码的,丢到在线base64解密网站中发现,得到一串明显是Jsfuck编码后的字符串,果不其然,再进行jsfuck解密,得到flag.

3.变异凯撒

凯撒密码:

凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推X将变成A,Y变成B,Z变成C。由此可见,位数就是凯撒密码加密和解密的密钥。现今又叫“移位密码”,只不过移动的位数不一定是3位而已。
下面我们总结一下:
明密对照表:
明文:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文:TUVWXYZABCDEFGHIJKLMNOPQRS
注:广义上的凯撒是位移的。

这里页面是给了一串字符串:bg[‘sZ*Zg’dPfP’VM_SXVd 同时页面还给了一个tip:flag的格式为flag{} 短字符串的常见加密算法有:凯撒密码,栅栏密码,摩斯密码,ASCII编码,培根密码等。因为没有给栅栏数的提示,不可能是栅栏,同时显然不可能是摩斯,因此先尝试凯撒密码,根据tip,发现b和flag中的f的ASCII码差4位,g与l差5位,[与a差6位,’与g差7位。因此这个规律就很显然了:差逐个递增的变异凯撒密码。编写简单的python得到结果。 做这个题让我感觉回到了高中数学找规律的时候。。有点亲切

4.计算

这个题是随机生成一串十六进制下的算数表达式,让我们在2秒内return一个正确的结果。显然需要自己get request再post回去,不多说直接上代码和结果:

看到官方给出了wp,所以再更新一下其它几道题的思路吧。。。(虽然很多工具都没听过也不懂)

5. base64解密15次即可。15次后解密再用栅栏密码,每组字符数5,进行解密。这题我是试了,但是用写的脚本进行base64多轮解却没结果?不知道为什么。

6. 确实是题目所说的希尔,但是要把密文转变成1-26,并形成矩阵a;再常规解密即可得flag。

7. 下载图片使用binwakl分析,发现zip压缩包,使用binwalk -e进行分离,根据提示是用QQ号加密,于是使用ARPCHPR Professional Edition爆破5-11位数字得到结果。

8. 进入赛题看到rsa256;openssl处理公钥文件,得到e,n;再因式分解

9. 查壳是无壳32位ELF文件,拖进ida直接看(我也不知道是啥),找到一个函数:sub_8048580。在该函数内的while循环每次进行过程中,都会调用memset函数栈区初始化,即每次while循环过程中,只有这次循环的起作用,其余的不起作用。经过思考,可以倒推这个符合条件的字符串;

10. 考点md5碰撞。使用fastcoll_v1.0.0.5 进行碰撞值获取,将获取的值二进制

11. 该题有两个password。首先查壳,是一个使用GCC编译的程序,没有加壳;放进IDA找可行字符串,找到了一个“You passed level1!”;找到引用该字符串的地方,顺利找到第一个password使用OD,动态调试一下第一个password的流程;找到程序在判断第一个password是否正确前,使用RtlAddVectoredExceptionHandler函数注册了一个异常处理函数,并第一个参数为1,表示出现异常后第一个使用这个注册的异常处理函数来处理,第二个参数就是异常处理函数的地址。异常处理函数中,在对比两个数值之后有一个字符串的输出,判读啊你应该是对比了第二个password之后输出提示字符串。

12. 观察URL /index.php?id===QM,==QM是1经base64转码后逆序;经fuzzing测试,发现过滤了空格,=,and,or,union,select等。其中and,or,union,select为单次过滤,使用anandd,oorr,ununionion,seleselectct可以绕过,=可使用like 替换;编写脚本后手注即可;

13. cms漏洞,连菜刀,根目录下找flag

14. 查看源码,发现index。phps文件,下载后进行分析;从代码中可以看到要求POST请求提交name和password。name和password的值不能相同,但是二者的sha1加密要求相同。post提交name[]=1&password[]=2得到flag。

另外有一道题目做到一半放弃了(一道音频题,用软件处理以后已经拿到了flag,但是答案不对,应该是需要再进一步处理,可是试了好久没试出来。注:现在搞清楚了。。。音频属性描述里有三个零,以此开脑洞把三个下划线换成三个0再MD解密),感觉找到了当年水程序设计竞赛时的感受。。不过个人觉得,信息竞赛还是比ACM要有意思的,也更有成就感,同时对码力一般的选手比较友好(所以码力一般我为啥要转到计算机来。。。),不过想打好比赛也需要刻苦的训练,而不是我这样裸考就可以的。如果大一大二的时候就接触了这个的话,我可能会入坑吧。不管怎么说,花了一天时间,了解了一些信息安全方面的东西,还是挺有意思也挺有价值的。希望自己在今年的事情忙完之后还能够有时间回来这个坑。

xinyu

目前为止有一条评论

Qjchen 发布于8:30 下午 - 4月 15, 2019

然后大佬就拿奖了