HBCTF第二场WP
https://blog.ctftools.com/2017/05/post153
发表于2017年5月23日
Misc
中非共和国-签到题
题作者:Dr3@m WriteUp作者:Dr3@m
\u0068\u0062\u0063\u0074\u0066\u007b\u7b7e\u5230\u9898\u007d
Unicode编码,解码即可,如下图
埃塞俄比亚-隐写术
题作者:Dr3@m WriteUp作者:Dr3@m
原题下载:http://hbctf-1252906577.costj.myqcloud.com/misc/color.png
用Stegsolve打开图片并左右翻页得到如图:
使用binwalk提取或者直接将文件后缀改为.zip解压打开得到如图:
连起来就是flag。
坦桑尼亚-知己知彼
题作者:Dr3@m WriteUp作者:Dr3@m
原题下载:http://hbctf-1252906577.costj.myqcloud.com/misc/2-1.zip资源库:https://www.ctftools.com/down/
下载附件打开看到BurpLoader.jar,如图:
想到burpsuite,猜想是明文攻击,题目给了提示去看资源库,于是到资源库下载并解压出BurpLoader.jar,如图:
顺便把明文攻击工具AZPR下载下来,在暴力破解一栏中。将BurpLoader.jar用好压压缩。安装并打开AZPR,可以点击Option把语言改为简体中文。将待解密压缩包放到“加密的ZIP文件”,攻击类型选择文本攻击(就是明文攻击),点击下方文本,将刚刚压缩的BurpLoader.zip放到“文本文件路径”,如图操作:
点击上方开始,一会之后即可得到如图:
出题时为了防止暴力破解,使用了一个md5作为压缩密码,所以上边显示没有找到密码,如果密码位数较短就可以找到,不过这不影响我们做题,点击确定后即可得到如图:
解压解密后的压缩包即可获得flag:
Crypto
马达加斯加-MIX大礼包
题作者:pcat WriteUp作者:pcat
原题下载:http://hbctf-1252906577.costj.myqcloud.com/crypto/MIX%E5%A4%A7%E7%A4%BC%E5%8C%85.py
这题的py脚本里面其实涉及了伪随机数,只要种子一样,之后的随机值都相同,关键点在于不同的操作系统,在题目里已经标明使用windows系统,而且为了不让新手陷入困惑,我都加上了assert来判断。解密的脚本直接把输出当输入,然后修改中间的运算
Python
# -*- coding:utf8 -*-# 使用windows系统fromrandomimport*defdemix():en_flag='SACBK8AEJCAOW52YL9ANBO7PQ0YvrEajcxnu7784704595388694801'seed("www.ChaMd5.org")out=''assertrandrange(0,100)==78forcinen_flag:ifc.islower():out+=chr((ord(c)-0x61-randrange(0,26))%26+0x61)elifc.isupper():out+=chr((ord(c)-0x41-randrange(0,26))%26+0x41)elifc.isdigit():out+=chr((ord(c)-0x30-randrange(0,10))%10+0x30)else:out+=cprintout#得到mixed_flag为 NBRGG5DGPNRGC43FL5XGSY3FX2FueGlhbmdf8316025876259956605passif__name__=='__main__':demix()
这题得到NBRGG5DGPNRGC43FL5XGSY3FX2FueGlhbmdf8316025876259956605,这才是真正要考查的地方,也许第一眼看起来会很懵逼。
本题的提示“MIX大礼包”,能否联想起类似的“BASE全家桶”,这题就是base32+base64+base16拼接起来,做题的突破口在于先拿去base64解码,直接解码是会报padding错,只要末尾加个=即可,然后看起来虽然是乱码,但中间你可以看到”_anxiang_”,
而”_anxiang_”的b64编码是X2FueGlhbmdf,从而把前后给分开,前面是NBRGG5DGPNRGC43FL5XGSY3F,字符集为[A-Z2-7],就很大可能是base32,解码为”hbctf{base_nice”,而后面8316025876259956605是十进制的表示,改为十六进制为0x73687579696e677d,十六进制变字符就是”shuying}”
所以flag是hbctf{base_nice_anxiang_shuying}
刚果(金)-DoYouKnowRSA
题作者:pcat WriteUp作者:pcat
原题下载:http://hbctf-1252906577.costj.myqcloud.com/crypto/DoYouKnowRSA.txt
这题纯属是给新手入门RSA(我的e值设置偏小,而且n值可以直接在factor.com上分解到,以前那网站上还没那条记录),题目里给出了c、n、dp、dq。可能比较陌生的是dp和dq,但只要搜索一下,找找资料的还是可以做的啦。
以下提供脚本即可,在脚本里你就会找到你想要的。
Python
# -*- coding:utf8 -*-__author__='pcat'__blog__='http://pcat.cnblogs.com'try:importgmpy2exceptImportError:print("Error: you must install the gmpy2")print("http://pcat.cnblogs.com/p/5746821.html")exit()deffoo():#已知n=0x27335d21ca51432fa000ddf9e81f630314a0ef2e35d81a839584c5a7356b94934630ebfc2ef9c55b111e8c373f2db66ca3be0c0818b1d4eda7d53c1bd0067f66a12897099b5e322d85a8da45b72b828813af23c=0x258f85f5d08a95a909a4d9a4c66bf4249fba21091ddfe9fcfcd33c9f4cf285af9eb99c77f839a1a7ee7791c1e98f023adf3b02561a8c45e651f1984852b9a0280e24bee7bd4fc95d217b874f135e693f748d7bdp=0x40dadac6db130c9b1a33bab328dc7335220e0e1ec26cc03bf405211013cdb500a70d1a619565f2c0aafdq=0x2f1af91dc6ae2abba0a0b7cb4bf1a6361157f39b06bb3b17c2ce6b208aa0b5be634922a7ccfcfc586c5#由factordb.com可计算p和q,建议先转10进制#或者用yafu来分解np=3423616853305296708261404925903697485956036650315221001507285374258954087994492532947084586412780871q=3423616853305296708261404925903697485956036650315221001507285374258954087994492532947084586412780869'''
d=gmpy2.invert(e,(p-1)*(q-1))
dp=d%(p-1)
dq=d%(q-1)
'''#解法InvQ=gmpy2.invert(q,p)mp=pow(c,dp,p)mq=pow(c,dq,q)m=(((mp-mq)*InvQ)%p)*q+mqprint'{:x}'.format(m).decode('hex')passif__name__=='__main__':foo()print'ok''''
#由于本题是面对新手的,e值弄个很小的,所以事实上你估计e值后也可以过关
e=0x10001
d=0x23ba51b0a167ed1733fa7655f5f4dd560a701f6e7b8ea9a3b21b9fd5a4ff971b9f86a91e60662f34afdb40f5f5551aebd489f39dff6c7b8c58852ccd3c2d07403b73ee83a859558b3318c279c26438e6e0c549
m='hbctf{RSA_15_C001_BEST_WISHES_TO_YOU_pcat}'
'''
Crypto
肯尼亚-creakme
题作者:逍遥自在 WriteUp作者:Fourele(点击访问原文)
原题下载:http://hbctf-1252906577.costj.myqcloud.com/reverse/creakme.exe
首先在ida中查看,从main函数可以看出程序大致流程是先读入一个字符串,然后经过encrypt处理,最后在check中与一个数组进行比较。
先看看check中的比较:
虽然用了rand函数,但是由于随机数种子已经给出,所以这个数组是相当于是已知的。
再来看encrypt中对输入的处理,就是将每个数和0x14异或,所以应输入的字符串可以由下面的程序生成:
Markup
#include
#include
int main()
{
srand(12);
for(int i=0; i<=13; i++)
putchar((rand()%10+48)^0x14);
return 0;
}
然后应该就是这道题的坑了吧,注意到在两个函数中都用到了flag这个全局变量,当此变量值为1的时候才执行输出flag的操作,于是在OD中先将这个变量修改为1,再输入刚刚生成的字符串,便得到flag了
下次比赛时间待定,感谢参赛。HBCTF官方群(点击加入):595176019
在博客中遇到的问题可以联系admin@ctftools.com
本文由Dr3@m原创发布,转载请注明来自HBCTF BLOG,转载代码(点击全选,请按"Ctrl"+"C"复制):