Sycsec-极客大挑战-Writeup
毕竟我不是搞web的,所以本文主要写的内容,主要是写二进制的,但是我也不是搞移动端和安卓的,所以我本篇文章的内容主要是reverse和pwn。
其次呢,因为笔者能力有限,所以如果有哪个地方写错了,或者写得不好,欢迎大家指出,谢谢。
比赛地址:http://geek.sycsec.com/
还有一点就是,这个比赛是成信三叶草准备招新的题目,所以很多地方都是挺适合入门者学习的,所以大神就别来看了。
二进制题目打包[下载
](http://pan.baidu.com/s/1nuJ1cDF)
Ernie
这个题目挺有意思的
主要看的是名字的name的长度,幸运数字,以及Key的值
贴出关键代码
这个题目逻辑还是挺清晰的,name是6位,key应该是16进制,也就是说2位转化成一个字符给S1,key本来应该是32位,那么S1将是16位
而这一段则说明了S1要与这里的红框的字符串相同,字符串是a_6sy2tcy3iy7se,所以输入的key应该就S1的16进制咯,
继续往下看
先进入 sub_8048717的函数看一眼
现在已知v6==6,这里不能让j小于0,所以反过来想,j只能为6,如果j小于6那么肯定就会小于0,就不对了。flag出不来了,所以j初始值是大于6的,到6停止,为达到停止条件,v3为6.
继续往下看,将s1与v3异或,然后转化成字符串,之后就得到flag了。
re100小透明
拿到文件 查壳,没有
打开程序
这看着像一个keygenme,问题来了帐号和密码是什么呢
这是关键代码,这里的逻辑是username和password的逻辑
,满足的逻辑是这样的:
usrname = ‘xxxxx’
buf = [11,70,23,32,32,61,17,44]
则key满足,ord(userame[i])-buf[i] = ord(key[i])
问题是这里我并不知道用户名什么,题目也没要求给,我看到程序的窗口有个Syclover,那么假定这是一个关于Syclover的keygenme的问题,尝试得到这个用户名的key
尝试提交,getflag
SYC{H3LLOCTF}
Re100-HelloWorld
这题就只是一个字符串比较
给新手一个技巧,在IDA中shift+F12可以搜索字符串
可以看到几个关键字符串,不知道为什么please input your name的字符串进去之后找不到关键,我索性单机“please input your PassWord”,
这里还有一个技巧,将鼠标放到关键地方,按‘X’键可以查看交叉引用
看到了这里有按位进行的字符串比较,但是这里只能看到ascii码不知道,所对应的字符是什么,这里还有一个技巧,是IDA的R键,可以将16进制转成字符
所以最后的结果是 SYC{Hell0_W0rld}
re50-送福利拉
这题是一个有多解的题目。。。很尴尬阿
打开OD去跟,
是一个立即数的比较
找到这个call,F7跟进去
几个比较都是上面的语句,其中ss:[ebp+eax-0x40],只有eax的值是变化的,eax又是取出我们的输入,所以调整我们的输入,就可以控制byte ptr ss:[ebp+eax-0x40]的值,使跳转条件不成立。这几个比较中,是分别与2、8、9、3、9、8、9、8,然而是栈中有这几个数的地方,就是上面提到的两串立即数。所以要调整输入,使ss:[ebp+eax-0x40]的值分别为2,8,9,3,9,8,9,8的栈地址。
所以只要控制我的输入,到和几个立即数相符就好了,我这里得到的是 20161010
所以我这的flag是 SYC[20161010]
Re200-你们要的极乐净土
听了极乐净土根本停!不!下!来! 听说只要绕过这些弹出的对话框就可以得到flag了,完全不用逆向哦。 have fun :) 提示:inline hook
这个题目音乐太好好听了,我都舍不得停下来了。恶心的是这弹窗好可怕,还好的是题目说了,弹窗没了,flag就出来了,这不就是咱们经常遇到的去广告,去弹窗的问题吗。
用OD加载,
以为去窗口我直接,Ctrl+G,找到我要去的API
在这个地方下段,并且将push ebp改成ret 直接让他返回
F9运行到断点,输入flag,等待几秒钟加密后的flag就出来了所以这里的flag是
SYC{F6A9D22C3018693B2FCC1B2D357F7AEAc}
pwn200-Rop-rop-rop
听说真正的魔法师都会rop,你是他的粉丝吗?https://pan.baidu.com/s/1o8Tipw2 nc 222.18.158.228 12341 (pwn的题目有加分哦,此题解出得400分)
最后是一个pwn的题目,毕竟是给新人做的,这个题目还是满友善的,step都告诉我们了,先用IDA打开。
这里的关键是怎么绕过if ( strlen(p) > 7 )的判断,我选择用
\x00进行截断。
题目还给了不少提示,题目的名字和这里都很明显的告诉我们要有三个的rop,那就顺着题目的意思来吧,这里进行构造payload,
rop链还要符合step1-3的check
看一下step3的伪代码
题目也给我们提供了一个cmd这还是蛮友好的。。。
1 | #!/usr/bin/env python |