首先,这个可以很容易的看出这是一个base64加密一串密文,然后用base64解密后是
可以看出这就是flag的格式,所以一般就是凯撒加密了,但是因为有花括号下划线之类的,所以是凯撒的一个变形rot13
这题是给了一个字符串baCoNBacoNbaconbACoNbacOnbAconBacOnbacoNbaconbacOnbACOnbACoN
可以看出给了我们的提示就是bacon,培根。
我这边的话是改了一个网上找的python代码,然后直接跑出来了。
因为培根密码是有两张密码表,同时因为大小写的话也有种情况,解出来应该是有四种(我这边另外一种以小写字母为b以大写字母为a的显示结果没有放出来)
import re
alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
first_cipher = ["aaaaa","aaaab","aaaba","aaabb","aabaa","aabab","aabba","aabbb","abaaa","abaab","ababa","ababb","abbaa","abbab","abbba","abbbb","baaaa","baaab","baaba","baabb","babaa","babab","babba","babbb","bbaaa","bbaab"]
second_cipher = ["aaaaa","aaaab","aaaba","aaabb","aabaa","aabab","aabba","aabbb","abaaa","abaaa","abaab","ababa","ababb","abbaa","abbab","abbba","abbbb","baaaa","baaab","baaba","baabb","baabb","babaa","babab","babba","babbb"]
def decode():
upper_flag = False # 用于判断输入是否为大写
e_string = input("please input string to decode:\n")
e_string=change(e_string)
print(e_string)
if e_string.isupper():
upper_flag = True
e_string = e_string.lower()
e_array = re.findall(".{5}",e_string)
d_string1 = ""
d_string2 = ""
for index in e_array:
for i in range(0,26):
if index == first_cipher[i]:
d_string1 += alphabet[i]
if index == second_cipher[i]:
d_string2 += alphabet[i]
if upper_flag:
d_string1 = d_string1.upper()
d_string2 = d_string2.upper()
print ("first decode method result is:\n"+d_string1)
print ("second decode method result is:\n"+d_string2)
return
def change(s):
str=""
for i in s:
if(i>='a' and i<='z'):
str+="a"
if(i>='A' and i<='Z'):
str+="b"
return str
def change2(s):
str=""
for i in s:
if(i>='a' and i<='z'):
str+="b"
if(i>='A' and i<='Z'):
str+="a"
return str
if __name__ == '__main__':
print ("\t\tcoding by qux")
while True:
print ("\t*******Bacon Encode_Decode System*******")
print ("input should be only lowercase or uppercase,cipher just include a,b(or A,B)")
print ("1.encode\n2.decode\n3.exit")
s_number = input("please input number to choose\n")
if s_number == "1":
encode()
input()
elif s_number == "2":
decode()
input()
elif s_number == "3":
break
else:
continue
题目展示就是这样的,一个密文,以及一个文件可以下载。这边这个文件用记事本打开稍微看了一下,有很多类似.pyt、__main__之类的东西,所以应该就是一个python编译后的文件了,这边推荐一个在线反编译python的网站http://tools.bugscaner.com/decompyle/
可以发现的是有四层加密
第一层凯撒加密
第二层base32
第三层base16
第四层栅栏加密取2
这边分享下我是如何分析这些代码是如何加密的。
在得到这个python代码后,每一种加密其实都可以单独取出来,然后自己定义一些需要加密的字符,然后可以看到加密后的内容,然后可以判段,如果判断不出来也没关系。
只需要将他的程序逆着写,然后将我们测试的加密后的内容,可以还原出加密前的字符,那么我们逆着的程序也就没有写错了。这样我们就能一步一步逆向出明文了。
这一题是真的太没有难度了
文本编辑器直接就搜出来了,当然更合适的做法肯定是用ida或od去搜
这一题的话,就是考察最基本的od动态调试的跳转,使用中文搜索引擎,然后找到相应的内容,双击进去,就可以看到这句话所在的汇编代码段了。然后一般是选择push ebp去跳转就能进去了。
启动程序,这边比较直接的就是直接跳进去,找一个能执行到的地方,改下汇编,让他jmp到我们之前找到的地址。
当然,这样可能会导致我们程序崩溃,但是我们只是要这个flag,只要让他显示出来就好了。
这题我当时是没有做出来的,只要当时没有找到真正的main函数,后来我发现一个找main函数的技巧。因为你直接运行那个需要你逆向的程序,是会出现一些信息的
输入123,他提示我try again。于是可以在ida中搜索这个字符串,ALT+T。
找到了main函数,就可以看的出来,他就是要将我们输入的东西,和v11到v34的值进行异或,最后的结果要等于v35就是”hang_dian_xin_gong_ctf!!”。 这边需要的知识点就是,抑或的时候A ^ B=C那么A ^ C=B 、B ^ C=A就都成立了
找到main函数如下
我把它改写成python代码大概是这个意思
然后最后这个v14等于v10就是正确的
这样我们就知道v14,于是上面的代码中我们不知道的就只有需要我们输入的buf[]。所以写一个求buf的代码