keygenme-py
29,953 users solved
Author: syreal
Description
00. 前言
本题用python编程,很抱歉的是,我的python功底很差,还有就是python环境还是不全,以后要补齐环境,并且有些函数仍然需要上互联网查询,也被这些无用代码干扰到了,所以这题也浪费了很长时间
01. 解题过程
1x01. 代码审计
分析代码入口点ui_flow()
根据函数摸到了menu逻辑部分menu_trial()
从menu的逻辑部分摸到了a,b,c,d具体的作用随后根据a,b,d调用的函数发现了a,b,d都是空壳,只有c程序有用
这是c的代码
发现了输入密钥的逻辑,他会拿着我们的user_key去进行一个check_key的操作,并传入一个全局变量bUsername_trial
于是我们去看看bUsername_trial
是什么东西
发现了字节码b"PRITCHARD"
好了,让我们进入check_key
吧
这看起来有些复杂,让我们从头开始
首先他声明了一个全局变量key_full_template_trial
去找key_full_template_trial
发现了key_full_template_trial
由三部分组成,如上图
我们把它组合起来:picoCTF{1n_7h3_|<3y_of_xxxxxxxx}
这看起来是flag格式
同时我们注意到了key_part_static1_trial
这也是需要用到的内容。
别忘了传入的bUsername_trial
=b"PRITCHARD"
1x02. 获得flag
我把check_key代码分成三部分
第一部分
检查key的长度是否和key_full_template_trial
相等
第二部分
检查key的第一部分(key_full_template_trial
被分成了三部分)是否与key_full_template_trial
的第一部分,也就是key_part_static1_trial
相等,于是,我们便获得了第一部分key:`picoCTF{1n_7h3_|<3y_of_
第三部分
这里的i是从上面传递下来的,也就是检查key第一部分之后的内容
可以看到它对bUsername_trial
计算了SHA-256值,并将结果转化为16进制,然后分别取了4、5、3、6、2、7、1、8索引的位置
于是我们写这样一个简单的脚本提取这些位置的字符串
import hashlib
username_trial = b"PRITCHARD"
n=hashlib.sha256(username_trial).hexdigest()
s=username_trial.decode()
print(n[4]+n[5]+n[3]+n[6]+n[2]+n[7]+n[1]+n[8])
54ef6292
然后将他添加到我们的key中,最后用}闭合:picoCTF{1n_7h3_|<3y_of_54ef6292}
1x03. 检查
它与key_full_template_trial的长度恰好相等
我们在程序里检查一下
完美,获得flag
picoCTF{1n_7h3_|<3y_of_54ef6292}