TopCtf
题目链接: https://pan.baidu.com/s/1jINx7Fo (在里面找相应的名字就行)
背景故事:
我是小白一枚,自学一些基础知识。。。
从朋友那得到的题,朋友说巨简单,然后各种不会。。。
不容易呀,千辛万苦终于做出来一道了。。。眼泪已经控制不住了。。。
解题思路:
用killer打开,反编译,很顺利反编译成功了,找到入口类,点击进入
查看java源码,找到了关键代码段,flag就是在此生成的
这段代码将paramString1的值MD5加密,每隔2个字符取一个字符,最后拼起来就是flag。
代码明白了以后,我们会发现还有两个未知的东西。
1、 toHexString()函数的作用。
2、 变量paramString的值。
接下来,继续往后看。
找到了toHexString()代码块,小白的我死活想不明白这句(String str = Integer.toHexString(paramArrayOfByte[i] & 0xFF);)是什么意思。。
直到看到了这篇文章 http://blog.csdn.net/huihui870311/article/details/49477739
了解到这是一段将字符串转换成16进制的代码,紧接着在下面又找到了edit_userName的值。可以知道edit_userName的值将会传给paramString
所有疑问迎刃而解,接下来开始写解密程序。
import hashlib par1 = b"Tenshine" def checkSN(par1):
if par1:
# if par2 and len(par2) == 22:
m2 = hashlib.md5()
m2.update(par1)
par1_md5 = m2.hexdigest()
print(par1_md5)
par1 = toHexString(par1_md5)
print(par1)
what = ""
i = 0
while i < len(par1_md5):
what += par1_md5[i]
i += 2
print("flag{"+ what +"}") def toHexString(s):
lst = ""
for ch in s:
hv = hex(ord(ch)).replace('0x', '')
if len(hv) == 1:
hv = ''+hv
lst += hv
return lst checkSN(par1)
运行结果: