2018QCTF-XMAN夏令营选拔赛

Web newscenter

发现搜索框是post数据


2018QCTF-XMAN夏令营选拔赛_第1张图片

用bp抓包,放在sqlmap下跑


然后就跑出来了


2018QCTF-XMAN夏令营选拔赛_第2张图片

Web Lottery

这个咋一看是一个类似双色球的东西,给你输入7位数,然后跟他后台生成的7位数对比,猜对的越多,得到的钱越多,目的是要去赚钱买flag,这种情况一般都不可能按正常操作来做的,估计都是篡改数据多一点


2018QCTF-XMAN夏令营选拔赛_第3张图片
2018QCTF-XMAN夏令营选拔赛_第4张图片

2018QCTF-XMAN夏令营选拔赛_第5张图片

我们点开html和js可以看到这个生成正确数字的过程,一个简单的if判断语句,我们只要改numbers[]数组的内容全部为true,就可以获得最多的钱


2018QCTF-XMAN夏令营选拔赛_第6张图片

所以我们先设置一波代理进行本地操作,然后用抓包工具进行改数据,改完再关掉代理,去购买flag,这题就解出来了,具体操作如下:


2018QCTF-XMAN夏令营选拔赛_第7张图片

2018QCTF-XMAN夏令营选拔赛_第8张图片

2018QCTF-XMAN夏令营选拔赛_第9张图片

2018QCTF-XMAN夏令营选拔赛_第10张图片

2018QCTF-XMAN夏令营选拔赛_第11张图片

Misc x-man-A-face

这题很简单,签到题吧,就一个缺角的二维码,用ps操作补齐,扫出来是一串base32,解码一波就出flag了


2018QCTF-XMAN夏令营选拔赛_第12张图片

2018QCTF-XMAN夏令营选拔赛_第13张图片

Misc x-man-keyword

2018QCTF-XMAN夏令营选拔赛_第14张图片

拿到这个png玩意,一波binwalk,010editor,stegsolve都没有什么发现,后面绝望之际偶然看到世安杯-LSB隐写-png那题,就突然想用lsb隐写试试,结果就解出来一串这样的的东西:
ps:这里我用的是lsb.py工具,密码我猜是lovekfc,结果就猜对了2333333


`PVSF{vVckHejqBOVX9C1c13GFfkHJrjIQeMwf}``
一开始以为是凯撒加密,试了好久没有发现什么,后面出hint,又去疯狂百度一波发现了不得了的东西:https://wenku.baidu.com/view/ab7a4f0131126edb6f1a10a0.html

2018QCTF-XMAN夏令营选拔赛_第15张图片

认真阅读了以后,再根据hint,写出解密脚本,一跑flag就出来了


2018QCTF-XMAN夏令营选拔赛_第16张图片

Pwn Xman-dice_game

这是一道猜随机数的题目,本来题目本意是以时间作为随机数种子的,但是如果输入的buf过多就会覆盖到随机数种子,从而导致种子不变化,生成的随机数不随机


2018QCTF-XMAN夏令营选拔赛_第17张图片

我们可以看到,下面的函数中实际上是让我们去猜一个随机数v2=rand()%6+1,并且保证v2是整数并且在1和6之间,如果连续猜对50次就可以拿到flag,那么我们就可以通过不断地产生随机数碰撞的方法,去获得一个固定的num[50],然后再把我们获得的num[50]输入到程序中从而获取flag


2018QCTF-XMAN夏令营选拔赛_第18张图片

生成随机数碰撞Exp如下:


2018QCTF-XMAN夏令营选拔赛_第19张图片

获得flag的Exp如下:
2018QCTF-XMAN夏令营选拔赛_第20张图片

2018QCTF-XMAN夏令营选拔赛_第21张图片

Pwn---- Xman-stack2

不得不说这是一道有点骚的题目
主要利用了数组下标溢出,然后配合利用了整数溢出
程序的主要功能是让你创建一个数组,由你来分配数组的大小,然后输入每个元素的数值,然后你可以追加元素进入数组,可以修改某一个下标的内容,还可以遍历数组所有的元素
首先的这个地方,造成了数组下标溢出:没有对输入的下标进行检查,导致我们可以在栈的任意位置进行写的操作


2018QCTF-XMAN夏令营选拔赛_第22张图片

这样我们就可以找到ret的地址,然后把ret的地址改成hackhere:0x0804859b,本以为这样就可以getshell了,没想到执行了这个函数后却被报错找不到“/bin/bash”


2018QCTF-XMAN夏令营选拔赛_第23张图片

说明这个命令被删了,我们只能自己构造system(/bin/sh),由于有数组下标溢出的漏洞,写操作倒不难,主要需要注意写的只能是10进制数和注意地址是小端序就行了,但是有个很坑的地方在于,如何确定ret的位置,按照栈来算的我一开始是算到112+4=116,也就是下标为115,然而怎么样覆盖都不对,只能自己通过gdb调试,最后找到ret的地址是在下标为132的地方,这也是很迷,但找到正确的覆盖地址后构造就不难了,主要构造两次payload:
1.【puts-plt】【main】【printf-got】
2.【system】【 】【/bin/sh】
第一次的构造是为了能够泄漏出printf的真正地址为:0xf7***020,从而找到libc的版本:


2018QCTF-XMAN夏令营选拔赛_第24张图片

从而得到:
【system的真正地址】=【printf真正地址】-【printf在libc中的地址】+【system在libc中的地址】
【/bin/sh的真正地址】=【printf真正地址】-【printf在libc中的地址】+【/bin/sh在libc中的地址】
这样一来,就可以get到shell拿到flag了


2018QCTF-XMAN夏令营选拔赛_第25张图片

另外,找ret地址的时候我采用的一直方法是,用整数溢出打印出255个栈的内容,然后大致摸索着加调试,慢慢就找出ret的地址了,如图泄漏栈:


2018QCTF-XMAN夏令营选拔赛_第26张图片
2018QCTF-XMAN夏令营选拔赛_第27张图片

最终exp如图:

2018QCTF-XMAN夏令营选拔赛_第28张图片

2018QCTF-XMAN夏令营选拔赛_第29张图片

2018QCTF-XMAN夏令营选拔赛_第30张图片

赛后瞎BB

打这个比赛体验了一把通宵,然而最终也才做出6题,相比去年的xman夏令营选拔赛题目,今年的难度高了很多,同时又让我意识到一个深刻的道理:我是真的菜orz
题目难度很迷,按道理来说xman夏令营选拔赛应该是对萌新友好一点的菜鸡互啄比赛,没想到这次是py风云下的诸神之战,pwn一共六道难度有点大,堆的题目占一半也就是知识盲区占一半。。唉蓝瘦,web总体看起来好像要简单一点,我这个非web手都能搞懂两题,然后misc是王者级难度在相当一段时间里misc大家都只能做签到题,无人解出另外三道。。。逆向和密码就不太会做就不知道难易了。。。另外发现每次有点水准的比赛都有rsa的题目,是时候去学一波这些有关rsa的知识了不然感觉会有点亏

你可能感兴趣的:(2018QCTF-XMAN夏令营选拔赛)