签退
.pyc文件,uncompyle6反编译,得到python源码,分析写在源码注释中
先变表base64,再凯撒加密,向后移动2位
import string
c_charset = string.ascii_uppercase + string.ascii_lowercase + string.digits + '()'
flag = 'BozjB3vlZ3ThBn9bZ2jhOH93ZaH9'
#encode为变表base64 table为c_charset
def encode(origin_bytes):
c_bytes = [ ('{:0>8}').format(str(bin(b)).replace('0b', '')) for b in origin_bytes ]
resp = ''
nums = len(c_bytes) // 3
remain = len(c_bytes) % 3
integral_part = c_bytes[0:3 * nums]
while integral_part:
tmp_unit = ('').join(integral_part[0:3])
tmp_unit = [ int(tmp_unit[x:x + 6], 2) for x in [0, 6, 12, 18] ]
resp += ('').join([ c_charset[i] for i in tmp_unit ])
integral_part = integral_part[3:]
if remain:
remain_part = ('').join(c_bytes[3 * nums:]) + (3 - remain) * '0' * 8
tmp_unit = [ int(remain_part[x:x + 6], 2) for x in [0, 6, 12, 18] ][:remain + 1]
resp += ('').join([ c_charset[i] for i in tmp_unit ]) + (3 - remain) * '.'
return rend(resp)
#rend为凯撒加密,字母向后移动2位,数字不变
def rend(s):
def encodeCh(ch):
f = lambda x: chr((ord(ch) - x + 2) % 26 + x)
if ch.islower():
return f(97)
if ch.isupper():
return f(65)
return ch
return ('').join(encodeCh(c) for c in s)
用工具CTFCrackToolsKt-3.2.4.jar得到凯撒加密前的字符串
再用工具加密解密小玩具解base64,即可得到flag
神光
exe程序,运行后输入key,ida分析
main函数,获取输入后check
跟进check,简单的将输入和明文字符串"wangzherongyao"比较
运行exe,输入"wangzherongyao",打印出一段不明意义的中文字符
继续向下走,在弹窗MessageBoxA后,sub_4113CF->sub_415770
input已知是"wangzherongyao",两段运算,然后打印
调试一下,如图所示,在call ds:MessageBoxA指令处下断点,因为程序有反调试,执行这条指令时会直接退出
执行流断在这里后,在ida中选中lea eax, [ebp+input]这条指令,右键->Set IP,将该指令设置为下一跳即将执行的指令,即可绕过反调试
绕过反调试后,在打印完成返回的地方下断点,F9运行到此处,在黑窗即可看到flag
签到
elf文件,ida分析
main函数,重点是第49行,输入与下标以及已知的v9数组进行运算
最后要求v6==0,由异或运算的特性可知,input=index ^ (index + (index ^ v9[index]))
取出v9元素,写脚本即可得到flag
v9=[102,109,99,98,127,58,85,106,57,82,122,55,81,19,51,35,67,
70,41,61,41,32,127,28,38,77,49,20,80,94,-24]
flag=""
for i in range(len(v9)):
flag+=chr(i^(i+(i^v9[i])))
print(flag)
#flag{A_s1mpLe&E4sy_RE_i5Nt_1t}
baby_gay
elf文件,ida分析
main函数,verifyPwd函数验证输入是否为"ZGFuaXU=",验证成功后会打印另一段字符串
然后就没有其他逻辑了,看了网上其他师傅的wp,说是解RC4,不过没看出来要解,比较迷惑