本帖最后由 Eaysuild.xean 于 2021-3-1 23:00 编辑
0X01 前(fei)言(hua)
实验环境:WIN10 Python3.8.7 / kali 2020.4 python2
0x02 拿题看题
- 判断python版本
print "Welcome to Processor's debugger!"
print "Please input you flag now!"
input = raw_input() #从raw_input()函数可知道此代码运行环境为Python2
原因:在 Python3.x 中 raw_input( ) 和 input( ) 进行了整合,去除了 raw_input( ),仅保留了 input( ) 函数,其接收任意任性输入,将所有输入默认为字符串处理,并返回字符串类型。
-
分析执行流程
- 先用python2跑一下程序
- 结合代码分析
# 第一部分 获取数据
input = raw_input() #接收输入的假码
if not input: #判断输入是否为空
print
"Are you kidding me?"
exit(0)
lenth = len(input) #获取输入假码的长度
if lenth <= 10: #判断假码长度应该 > 10
print
"Short flag!"
exit(0)
print
"len:%d" % (lenth) #输出输入假码的长度
# 定义输出格式
print "OK,let's debug it! You can 'Step' by 'Space'!" # 输入空格然后按下回车输出
print "--------------INFO--------------"
def debuginfo(dic): # 定义输出格式子程序 模拟寄存器的输出
print "eax: %d" %(dic['eax'])
print "ebx: %d" %(dic['ebx'])
print "ecx: %d" %(dic['ecx'])
print "zf: %d" %(dic['zf'])
print "--------------INFO--------------"
# 第二部分 数据处理
index = 0 #输入的假码的位置索引
idx = 0 #最后判断的位置索引
arr = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83] #第二参数集
check = [-56, -50, -118, -105, -98, -101, -117, -105, -96, -42, -80, 89, 78, 70, 177, 86, 126, 80, 80, 96, 177, 109, 28]
#对比集
result = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] #结果集
dic = {'eax': 0, 'ebx': 0, 'ecx': 0, 'zf': 0}
while raw_input() == ' ':
if index <= 10: #假码前11位 进行以下
#-----------------算法1-Start-----------------------------
dic['eax'] = ~ord(input[index]) # EAX=取出假码索引处的值->取ASCII码->取反
dic['ebx'] = 0
dic['ecx'] = index #索引数
dic['zf'] = 0
debuginfo(dic)
if raw_input() == ' ':
dic['eax'] = dic['eax'] ^ arr[index] #EAX = EAX 和 arr索引的值 进行异或
dic['ebx'] = arr[index] #EBX = arr 索引的值
dic['ecx'] = index
dic['zf'] = 1 #变1
result[index] = dic['eax'] #EAX的值 保存到结果集
debuginfo(dic)
#-----------------算法1-END-----------------------------
else: #从第12位开始 进行以下
#-----------------算法2-Start-----------------------------
dic['eax'] = ord(input[index]) + arr[index] #EAX = 取假码索引处ASCII码 + arr索引的值
dic['ebx'] = arr[index] #EBX= arr索引的值
dic['ecx'] = index
dic['zf'] = 1
debuginfo(dic)
if raw_input() == ' ':
dic['eax'] = dic['eax'] ^ 0xcc #EAX = EAX 异或 204
dic['ebx'] = 0xcc
dic['ecx'] = index
dic['zf'] = 1
result[index] = dic['eax']
debuginfo(dic)
#-----------------算法2-END-----------------------------
index = index + 1
if index == 23 or index == lenth: #可知flag的长度为23
break
while raw_input() == ' ':
dic['eax'] = result[idx] #EAX = 结果集索引值
dic['ebx'] = check[idx] #EBX = 对比集索引值
dic['ecx'] = idx
if dic['eax'] != dic['ebx']: #进行比较
dic['zf'] = 1
print
"Wrong flag, try again!"
exit(0)
else:
dic['zf'] = 0
debuginfo(dic)
idx = idx + 1
if idx == 23 or idx == lenth:
if lenth == 23:
print
"Yes, you got it!"
exit(0)
else:
print
"Close to right!"
exit(0)
- 核心算法流程图
0X03 逆向思维结题
- 正确的FLAG 到程序最后 应该是和对比集完全一致
check = [-56, -50, -118, -105, -98, -101, -117, -105, -96, -42, -80, 89, 78, 70, 177, 86, 126, 80, 80, 96, 177, 109, 28]
#对比集
- 把对比集 当作输入 并且将过程中的运算变为逆运算
异或 逆运算 还是异或
ord() 逆运算 chr()
取反 逆运算 取反
加号 逆运算 减号
然后取对比集的第一个逆运算尝试一下,看来没问题
- 写算法代码
index = 0
idx = 0
arr = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83]
check = [-56, -50, -118, -105, -98, -101, -117, -105, -96, -42, -80, 89, 78, 70, 177, 86, 126, 80, 80, 96, 177, 109, 28]
while index <= 23:
if index <= 10 :
temp=~(check[index] ^ arr[index])
else:
temp= (check[index] ^ 0xcc) - arr[index]
print(chr(temp), end="")
index=index+1
if index == 23:
break
运算结果:52pojie{H4PpY_New_Ye4R}
4.验证结果
|