文章目录
- 一.Base
- 二.How to use python
- 1.程序逻辑分析
- 2.爆破flag[11]~flag[14]
- 3.爆破sha1
- 4.sha256掩码爆破
- 三.IKUN检查器
- 1.查看程序信息
- 2.分析程序逻辑
- 3.button1_conClick函数
- 4.check1函数
- 5.check2函数
- 6.check3函数
- 7.check4函数
- 8.check5函数
- 四.junk code
- 1.使用32位动态调试工具调试
- 2.使用CheatEngine
一.Base
题目逻辑
1.接受输入字符串
2.encode1加密
3.encode2加密
4.将加密后的flag进行比对判断
encode1是个凯撒加密,位移为3
encode2是base64
解密:
先base64解密后凯撒得到welcometotheworldofctf
二.How to use python
1.程序逻辑分析
import base64
import hashlib
import sys
def abort():
print("Wrong flag!")
sys.exit(1)
print("Please input the flag:")
flag = input()
if len(flag) != 29:
abort()
if flag[:5] != 'Neepu':
abort()
if flag[16]!='a' or flag[17]!='_':
abort()
if flag[22]!=flag[17]:
abort()
if flag[28:] != '}':
abort()
if base64.b64encode(flag[-4:].encode()) != b'X2t1fQ==':
#_ku} 从倒数第四个字符开始切片,包括倒数第四个字符 base64解码即可
abort()
if flag[-2:-15:-3].encode().hex() != '75316c745f':
#u1lt_ 倒数第二个到倒数第15个,每隔3个取一次 十六进制转字符串即可
abort()
if sum(ord(x) * 10000 ** i for i, x in enumerate(flag[11:15][::-1])) !=110009500490115:
#下标11到14共4个字符爆破得到n_1s
abort()
if hashlib.md5(flag[9:3:-2].encode('utf-8')).hexdigest()!='db46a959e0f94c0a8977411ab69df11a':
#hy{ 下标九到三 查md5在线网站或者爆破都可以
abort()
if hashlib.sha1((flag[6]+flag[8]+flag[10]).encode()).hexdigest()!= 'dcb7ec019a90e41f85181ec9f1da642a8ced1b2d':
#Pt0 sha1爆破
abort()
if hashlib.sha256(flag.encode()).hexdigest() != 'a04f00829f27a5ead1c4ae526d6b1b0cec30ed0e56d6d71e9c001d7803e84892':
#sha256爆破
abort()
print("You are right!")
2.爆破flag[11]~flag[14]
for a in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_":
for b in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_":
for c in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_":
for d in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_":
str=a+b+c+d
if(sum(ord(x)*10000**i for i,x in enumerate(str[::-1]))==110009500490115):
print(str)#n_1s
3.爆破sha1
md5在线解密网站:https://www.bejson.com/enc/md5dsc/自行解密
sha1爆破
hashcat -a 3 -m 100 dcb7ec019a90e41f85181ec9f1da642a8ced1b2d ?a?a?a
4.sha256掩码爆破
最后组合到的掩码Neepu{Pyth0n_1s_a_t?a?al?a?a1_ku}
hashcat -a 3 -m 1400 a04f00829f27a5ead1c4ae526d6b1b0cec30ed0e56d6d71e9c001d7803e84892 Neepu{Pyth0n_1s_a_t?a?al?a?a1_ku}
或者使用爆破脚本
import hashlib
string='Neepu{Pyth0n_1s_a_t??l??1_ku}'
for a in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_":
for b in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_":
for c in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_":
for d in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_":
string_try = string.replace('?', a, 1).replace('?', b, 1).replace('?', c, 1).replace('?', d, 1)
hash_object = hashlib.sha256(string_try.encode())
hex_dig = hash_object.hexdigest()
if(hex_dig=='a04f00829f27a5ead1c4ae526d6b1b0cec30ed0e56d6d71e9c001d7803e84892'):
print(string_try)
三.IKUN检查器
1.查看程序信息
可以发现是C#编写的,使用dnSpy分析
dnSpy项目地址:https://github.com/dnSpy/dnSpy
2.分析程序逻辑
将程序用dnSpy打开后,点击From1,可以找到check1~check5函数
tips:可以使用上方的搜索功能搜索关键字符串从而定位
3.button1_conClick函数
可以看到做了对flag的判断,分别截取flag的不同部分并调用不同的check函数最后将加密结果拼接起来并输出结果
4.check1函数
md5加密,解密得到1998-8-2
5.check2函数
check2是sha1
很奇怪参考wp:Neepu Re Writeup里说sha1也是md5,而且真的能解密出来jinitaimei
查了一下也没看出个所以然,如果有大佬知道请告诉我
6.check3函数
给了个’-’
注意是两个字符串所以有两个’-’
7.check4函数
AES加密
text是密文,bytes是密钥,并且可以看到Mode是ECB,PaddingMode是PKCS7
可以使用密码学工具箱解出xiaoheizishiba
8.check5函数
sha256,也就是把上面得到的结果拼接起来进行hash(也可以运行程序通过验证得到flag)
拼接结果:1998-8-2-jinitaimei-xiaoheizishiba
sha256:b8688fc33b5786095dc70a34ad14b9623905185663fa26dcc75d3b6b1f69999e
flag:Neepu{b8688fc33b5786095dc70a34ad14b9623905185663fa26dcc75d3b6b1f69999e}
四.junk code
程序貌似会给flag,但是输出速度非常之慢
1.使用32位动态调试工具调试
可以使用32位debug工具调试
打开之后按f9运行程序,然后右键查找字符串
可以直接找到flagNeepu{it-1s-not-junk-code-1u-1u-the-qq-bin-mat}
2.使用CheatEngine
附加进程,选择搜索字符串并搜索Neepu{
然后对该地址右键并选择浏览相关内存区域
然后就可以看到flag
Neepu{it-1s-not-junk-code-1u-1u-the-qq-bin-mat}
五.奇怪的ELF
晚点继续复现…