XCTF嘉年华体验赛逆向writeup

mark一次ctf逆向

一共有两道题:re1和re2

re1签到题
下载附件发现是elf文件,直接上ida,F5之后代码一目了然
这里写图片描述
可以看出来flag是一个四位数,每一位相加是23,十位除个位等于2,百位减十位等于-1,千位模十位等于3,解四元方程求出来就可以了。
flag是9563

——————————————————————————————————————————
re2
re2有点意思但也没有很复杂,同是elf文件
先定位出main函数,空格转换成图形视图看一下逻辑
这里写图片描述
前面是一段输出,可以不用管了往下继续看
这里写图片描述
var_4在这是一个循环变量,一共循环1D次
这里写图片描述
结合loading字符串还有sleep、rand函数可以知道这里就是拖延时间,1D次循环之后来到输入用户名和密码的环节,但是当输入完username和password之后发现后面有一个”logging”字符串,猜想可能下面又有熟悉的拖延时间套路…
这里写图片描述
事实证明确实是的。主要就是看时间磨完之后上图右段代码
(ps:我这里是分析完之后的界面,所以部分变量名和函数名有些改动
先进入第一个函数看看
f5之后:这里写图片描述
这个没什么限定条件,就是如果你输入的username大于50就当成50字节的来算了…主要还是看循环内的那个函数:
这里写图片描述
又是熟悉的配方,解多元方程,最后得到username长度是8或者12
退出来看第二个函数
这里写图片描述
解方程+1… 把username分成了三个双字,一共是12个字节,分别计算出来first=61746163,second=7473796C,third=6F65635F.但这里应该注意的问题是小端模式是小对小、大对大,将以上转换成字符串的时候不要忘了每四个字节倒序输出。
最后得到username:catalyst_ceo
再退出来
这里写图片描述
可以发现第三个函数的参数也是username,推测应该是对username的再验证,所以并没有再去分析,而且动态调试的时候这里也没结束进程。
进入第四个函数
这里写图片描述
这里两个参数分别是username和password,应该这里就是验证password部分了,进去f5:
这里写图片描述
前面这一段循环是检验password每个字符的ascii码范围,接着往下看:
这里写图片描述
这里有一个srand和rand函数的搭配,接着往下是一共10个双字的验证,每个双字都等于rand()+k(k是常数),因为我并不知道rand和srand具体关系所以我选择去动态调试,再次转换成汇编,用remote linux debugger调试,再rand函数上下断点
这里写图片描述
这里rand函数返回值是保存在eax当中,f8步过rand函数查看eax的值
这里写图片描述
用当前eax的值加上cmp的后一个操作数就得出来当前双字的具体值,对于后面9个双字也是同样的操作,同样注意小端模式,得到的password是sLSVpQ4vK3cGWyW86AiZhggwLHBjmx9CRspVGggj
退出来再看最后一个函数
这里写图片描述
两个参数分别是username和password,可以看出来这里根据username和password输出flag,因为我们的username和password都是正确的所以这个函数也就跳过分析,动态调试直接f9运行完,最后成果图如下:
这里写图片描述
最后的flag:ALEXCTF{1_t41d_y0u_y0u_ar3__gr34t__reverser__s33}

猜你喜欢

转载自blog.csdn.net/weixin_43090100/article/details/82180752