文章目录
一.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
这题当时用attach附加调试没做出来
1.脱壳
upx -d move
2.函数逻辑
mov混淆,有相似的题movfuscator混淆——re5-packed-movement讲的挺好
关于mov混淆原理这里推荐几篇文章:
反混淆环境由于我git下载很慢还没配好,这里使用search搜索机器码可以直接出
六.Xor
这题是go语言逆向,使用ida8.2可以分析出一些函数,低版本分析出来的结果比较丑陋
IDA8.2FreeWare下载地址:IDA Freeware Download Page
1. 定位主函数
进去后发现找不到主函数,这题有两个方法可以定位
首先运行程序可以看到输出Please input the flag
那么我们可以根据字符串引用去查找,交叉引用两次即可
第二种方法,由于需要输入flag,所以可以搜索scan函数,对Fscanln交叉引用向上查找即可
然后就可以定位到主函数,向下翻找可以看到关键逻辑异或
2. 程序逻辑
这里的v17每次循环都有个是否大于等于4的判断,然后用v17作为偏移在qwer中查找字符
所以可以猜测是类似于qwer[i%4]的功能,然后和data进行异或(果然逆向还得靠猜)
3. 解题脚本
这里比较坑的一点是ida8.2free ware不能写idapython脚本
使用idapro7.7打开刚刚8.2分析出来的数据库文件,下断点动态调试(静态看不到v25密文的值)
点击v25跟进查看地址(或者根据相对于rsp,rbp的偏移来算出地址)
使用idapython脚本输出flag即可(idapython脚本我总结过一点基础操作这题足够用了:IDAPython入门基础语法)
flag:Neepu{X0r_is_easy_1234123412345}
七.参考wp:
- Neepu Re Writeup
- NEEPUCTF 2023 Official Writeups(Neepu群内有)