0x01来自:
宋志伟 信息安全2017-1
0x02签到题&Encode:
签到:关注微信公众号SKSEC,发送"give me flag"。得到flag。
ASCII :ASCII码在线转换 http://www.ab126.com/goju/1711.html#ecms
HEX : 16进制在线转换 http://www.bejson.com/convert/ox2str/
Escape : escape加密 http://tool.chinaz.com/Tools/escape.aspx
Jsfuck : jsfuck加密 https://www.bugku.com/tools/jsfuck/
附常见加密与编码的总结 : https://www.cnblogs.com/mq0036/p/6544055.html
0x03web:建议用火狐或者谷歌浏览器
1.你能看见flag吗:打开网页按F12直接看到flag
2.GET : 打开网址后发现代码
$get=$_GET['get'];
echo $get;
if($get == 'flag')
echo 'flag{*************}';
在地址栏输入?get=flag,回车得到flag;
3.找一找flag : 打开后一直弹框;鼠标右键查看源代码,发现最下边
base64解密得到flag;
4.where_are_u_from : 打开后提示 ”Please access the server from the local“ 意思就是从本地访问 f12-网络->重新载入->编辑消息头下面加上 X-Forwarded-For: 127.0.0.1 点击发送看响应得到flag;
5.JS Console : 题目给出提示控制台执行js代码;f12,调试器中看到源代码
可以看到a就是密码;控制台输入print(a)得到密码,提交得到flag;也可以直接复制源码,在return false前加了一句 document.write(a); 直接输出a的值有点麻烦;
6.locate:打开后先按f12->重新载入后,在点击flag在哪里啊; 会发现出现一个302,响应头中发现flag;base64解码得到flag;
7.成绩单:Bugku原题 https://www.cnblogs.com/hell0w/p/7906711.html
8.header:题目提醒header;查看消息头中发现flag;base64解密的password,地址栏输入?Password=e64b78fc3bc91bcbc7dc232ba8ec59e0 回车得到flag;
9.phpmd5:打开发现phpmd5漏洞
详情请见:https://blog.csdn.net/vspiders/article/details/78218512
常见漏洞; 将username和password转换成数组即可;地址栏输入 ?username[]=a&password[]=b 回车得到flag;
10.简单的sql注入:输入万能密码:' or 1='1 ,没有小红sqlmap直接跑出来;https://blog.csdn.net/qq_35304570/article/details/79358597
0x04Crypto
培根,Base64,Caesar来啦,栅栏里的爱 http://tool.bugku.com/CTF|CTF工具下载|CTF工具包|CTF教程
base一家:两次base64,一次base32,一次base16解密得flag;
仿射密码:
RivestShamirAdleman:。。。这题折磨了我一个星期没做出来。在ubantu上试了很多方法,要么乱码,要么错误。最后装了kali以后直接openssl就能就出来。附上openssl常见用法:
openssl rsa -pubin -in (文件名) -text :提取公钥信息,
openssl rsautl -encrypt -in test -out test.enc -inkey asn1pub.pem -pubin : 公钥加密
openssl rsautl -decrypt -in test.enc -out test.dec -inkey asn1enc.pem : 私钥解密
openssl rsautl -sign -in test -out test.sig-inkey asn1enc.pem : 私钥签名
openssl rsautl -verify -in test.sig -out test.vfy -inkey asn1pub.pem -pubin : 公钥验证
这个题先从公钥提取信息,生成私钥,在进行私钥解密;穿起来就是flag;附上由p,q,e生成私钥脚本
import math
import sys
from Crypto.PublicKey import RSA
keypair = RSA.generate(1024)
keypair.p =
keypair.q =
keypair.e =
keypair.n = keypair.p * keypair.q
Qn = long((keypair.p-1) * (keypair.q-1))
i = 1
while (True):
x = (Qn * i ) + 1
if (x % keypair.e == 0):
keypair.d = x / keypair.e
break
i += 1
private = open('private.pem','w')
private.write(keypair.exportKey())
private.close
https://www.anquanke.com/post/id/84632 https://www.freebuf.com/articles/others-articles/161475.html
0x05Misc
1.Ez密码:题目提示密码为17年以后的8位日期当密码;直接使用ARCHPR暴力破解
解压出图片查看属性->详细信息得到flag;常见图片隐写术总结:https://blog.csdn.net/riba2534/article/details/70544076
2.小猪佩奇:stegsolve打开(要有java环境);点击下方箭头更改颜色通道
扫码得flag;
3.Fonts:winhex打开,在下方发现flag
4.miao:这题做的最痛苦了;根据题目提示,发现zip缺少文件头,添加文件头后发现损坏的图片,winhex打开后对照jfif文件格式发现16进制数据错位。彩笔的我不会py,最后琢磨了几天用notepad++手动一列一列的还原。。。。打开图片即得flag;
5.ZipWithCrypto:zip伪加密,winrar打开点击工具修复zip文件即可,记事本打开flag发现加密字符串。此案栅栏密码将两个花括号匹配好,然后凯撒密码解密得flag;https://blog.csdn.net/kajweb/article/details/76474476 https://blog.csdn.net/pdsu161530247/article/details/73612910
6.Crack it:省赛题;shadow文件破解:先了解一下shadow文件;kali下有专门得破解工具;执行john -show shadow;
不得不说kali好用;
7.啊哒:jpg图片,kali下binwalk跑一下发现隐藏压缩包,
binwalk -e ada.jpg 分离,zip加密,在ada.jpg属性中发现16进制
转成字符串即为压缩包密码;
8.basic:很明显得像素点转换成图片,百度脚本跑一下即可;
# coding=utf-8
from PIL import Image
import re
pic = Image.new("RGB",(150,900))
f = open('basic.txt','r')
imlist = []
for i in f.readlines():
i = re.sub('[( )\n]','',i)
imlist.append(i)
i=0
for x in range(0,150):
for y in range(0,900):
s = imlist[i].split(',')
pic.putpixel([x,y],(int(s[0]),int(s[1]),int(s[2])))
i+=1
print 135000-i
pic.show()
pic.save("flag.png")
9.进制转换:思路也很清晰,手动一个一个对着ASCII码表解得。。。。看了大佬wp才知道用脚本
f = open("./text.txt","r")
flag = ""
for i in range(107):
s = f.readline()
if s[0] == 'b':
flag += chr(int(s[1:],2))
elif s[0] == 'd':
flag += chr(int(s[1:]))
elif s[0] == 'o':
flag += chr(int(s[1:],8))
elif s[0] == 'x':
flag += chr(int(s[1:],16))
print(flag)
f.close()
好好学python。。。
10.神秘的文件:打开压缩包发现flag压缩包,与logo.png。flag压缩包内也有一个logo.png。两者CRC32相同。明文攻击。将flag.zip与logo解压出来,将logo压缩,使用ARCHPR明文攻击
得到密码,winhex打开doc文件,最下方发现有flag.txt,binwalk分离找到flag文件,base64解码的flag;
0x06Reverse:
1.Re-1:打开,shift+f12搜索字符串的到flag;
2.getit:ida打开发现疑似base64加密的字符串
题目提示这并不是flag,并且base64解不出flag,考虑base64中“=”往往是在最后的,栅栏密码解密将=移至最后,得到 U0tDVEZ7V2UxMVkwdUdldDF0fQ== 再用base64解密得flag;
3.baby:apk逆向;AK打开发现反编译失败;百度后找到答案,取出apk中classes.dex文件,用apktoolbox(吾爱破解爱盘下载)转成jar,AK打开就能看见java源码
凯撒解密即可;
4.newDriver:ida64打开f5看伪代码。
可以看到三段字符串以及加密算法。dAP6L5H`e5Tn与6异或。kOc`jS/WUGw加3(ascii码+3)第三段直接base64解密即可。穿起来即为flag;
解出flag1,flag2,base64解码即可。当初用ida6.8时会出现类似下面这种情况,并且会发现字符串是倒着得,选中按R,倒回来即可
5.Take these scores:ida打开,shift+f12 搜索到一堆md5加密字符串
https://www.somd5.com/解密即可;
6.signin:apktoolbox将dex转成jar查看源码。
如果输入与getflag中字符串逆序base64解密后一样,则成功。直接去资源文件中查找
逆序base64解密得flag;
7.Re-2:还是apk。直接拖进AK查看源码得到flagasccii码
8.shell:upx壳。PEID查壳是upx的壳,百度找工具直接能脱掉。手动脱壳总结:https://www.52pojie.cn/thread-259984-1-1.html
这个题比较简单,不需要脱壳也可以做:OD打开程序
F7,在004017A4跳转。紧接着跟着一个call。
f7进入。搜索ascii找到关键点
scanf后下断点
f9运行,输入密码12456789后断在4015C3处。f8单步运行。4015D5处函数获得输入字符串的长度,
一直f8,直到4016F1,发现strcmp字符串比较函数以及两个疑似base64加密的字符串。
base64解密的到我们输入的“123456789”以及“w0y_Fsi_gFxj64_1x_jf5d”原本以为这就是flag,叫上却错误。在分析,我们输入w0y_Fsi_gFxj64_1x_jf5d以后发现
原本输入的字符串变了。可以看到除了数字跟下划线其他字符都循环加了5。当初我是一个一个对着26个字符对出来了,刚刚反应过来是凯撒加密。。Orz。。。写完去好好研究一下手动脱壳。。
9.Play a game:老套路。OD载入,搜索字符串。
运行几遍就能发现规律,跟着提示按下回车就会随机产生一个点数,如果更提示要求的点数一样则进行下一步,否则gameover。每一次比较都有型如下图的判断。在每一个jnz下断点,修改ZF的值为1;运行即可。
最后flag是个这???!!!
百度以后发现是原题,参考他们的解法。将每一个jnz都nop填充。保存后在DOS窗口运行。一路回车敲出flag
10.Debug or Die:OD打开F9发现直接飞了。单步f8一直运行到11B1485飞了,下断点,重新载入,f9再次到这里,f7进入。
f8单步执行发现s%,输入函数??果然,随便输入123456789
发现如下代码:计算输入字符串长度,与0x2A比较,不等则跳转,修改ZF值为1。
下方发现加密代码
本来想参考上一个题将两个jnz nop掉。结果不行。老是一步步分析吧。。
可以看到上边的算法是将我们输入的字符的16进制值进行sar 运算,下面的进行and运算。都是位运算。。头大。sar指令是算数右移运算符:例如
sar eax,1 : eax的值为7(0000 ……0111),则移位以后,eax的值为3(0000…… 0011),高位用符号位补充,即0补充。这里说一下shr逻辑右移运算符:以为是与sar唯一区别就是高位用0补充。
and:与运算
mov al,01100011B
and al,00111011B ;执行后:
al=00100011B
补充一下or指令
mov al,01100011B
or al,00111011B ;执行后:
al=01111011B
歪日!看完还是很懵圈。。分析一下:
先是右移4位,然后与0xF进行与运算sar eax 0x4 也就是除以2^4=16;一个数的16进制除以16;那不就是这个数值的16进制值的“高位”吗。比如0x63除以16得到的整数位就是6。
再看and。and esi 0xF ; 0xF的二进制就是 00001111 ;esi存放的也是输入字符的16进制值。and运算后。esi中存放的字符二进制的“高4位”肯定是0,运算结果也就是“低4位”的值。也就是说前面sar运算得到了字符16进制的“高位”,and运算得到“低位”。仔细思考一下就会明白。
那么就一步步执行,记录“高位”和“低位”。然后对着ascii码表找出flag。。。附上我当初找的图片。。。不知道有没有简单一点的方法。。。。
11.file:拖进ida,f5看伪代码
发现加密算法 :k ^ v14[k] ^ v13[k] ; 双击查看flllag与sttr_home;
sub_400EB9函数将sttr_home转换成10进制。然后异或得到16进制数。题目提醒flag是丢失文件的md5值。将得到的16进制写入文件百度找计算文件md5值得工具得到flag;
12.F5已扣,谁回谁怂:拖进ida,按f5报错。
经表哥提醒知道是花指令干扰静态编译。了解以下反反汇编https://blog.csdn.net/pianogirl123/article/details/53871397; http://www.cnblogs.com/h2zZhou/p/6637890.html
看完确实能收获很多。。回到题目,找程序中得花指令,可以看到jz跳转紧接着跟着一句毫无意义的指令:add esp , 4 ;光标移到到条指令,按下D键(将该汇编语句转为数据),按f5,得到伪代码。
加密算法是简单的异或。v8是rand()产生的伪随机数(详情百度)。异或一边即可得到flag的ascii码值。注:要在linux系统解题,因为srand()函数在window系统和linux中产生的随机数是不同的;附上解密代码
13.ida很好用?:拖入ida,f5,逻辑很简单,但是有个calc()函数,以及4个不知道是啥的变量;
开始还以为是代码混淆,捣鼓了4,5天毫无进展。。最后问表哥说是符号执行,于是开始百度。百度有很多示例与py脚本这里不列举了。符号执行的思想是使用符号值来表示程序的输入数据,并将程序的运算过程逐指令或逐语句地转换为数学表达式,在CFG的基础上生成符号执行树,并为每一条路径建立一系列以输入数据为变量的符号表达式。。angr跑出答案。GitHub上angr的中文说明;最难的是搭建angr的环境。。。搞故了一天终于弄好。。(建议用kali,我在u版图上遇见各种毛病。。)