[SWPUCTF 2021 新生赛]简简单单的逻辑
py文件,使用pycharm打开进行分析
其中,hex()[2:]:将十进制转化为十六进制
zfill(2):位数不足2,前补0
这里即将flag的ASCII码与key进行异或,再将每位转化为十六进制,不足两位数则前补0
所以,要进行逆向写脚本
即先把result的每位两两一组转化为十进制,与key异或后转为字符
两两一组:result[i*2:i*2+2]
转化为十进制:int(x,10)
最终脚本如下:
flag=''
list= [47, 138, 127, 57, 117, 188, 51, 143, 17, 84, 42, 135, 76, 105, 28, 169, 25]
result='bcfba4d0038d48bd4b00f82796d393dfec'
for i in range(len(list)):
key=(list[i]>>4)+((list[i]&0xf)<<4)
flag+=chr(int(result[2*i:2*i+2],16)^key)
print(flag)
[SWPUCTF 2021 新生赛]re1
为应用程序,先查壳
无壳,64位,使用ida64打开,反汇编
分析一下,即将{34sy_r3v3rs3} 中的3都换成e,4都换成a,脚本如下:
str='{34sy_r3v3rs3}'
for i in str:
if i=="3":
print('e',end='')
elif i=="4":
print('a',end='')
else:
print(i,end='')
[NSSCTF 2022 Spring Recruit]easy C
打开c文件
分析代码,即将a[i+1]与2异或,再与b进行比较,直接使用b逆向(先异或,后-1)写出脚本如下:
str='d`vxbQd'
flag=''
for i in range(0,7):
flag+=chr((ord(str[i])^2)-1)
print(flag)
[LitCTF 2023]世界上最棒的程序员
为应用程序,先查壳
无壳,32位,使用ida32打开,反汇编
进入start,直接得出答案
[SWPUCTF 2021 新生赛]简简单单的解密
使用pycharm打开,分析
前面都是对s_box,res等进行操作,主要是看最后四行,先看最后一行
查询后得知,quote函数可以将URL中的特殊字符进行编码,比如中文等,使得它们可以安全地在URL中传递;unquote函数即将URL中的编码字符解码成为原字符,与quote函数相反。
所以先直接对enc进行解码
flag = urllib.parse.unquote(enc)
倒数第三,二行是进行了一次base64加密和解密,最终不会对结果产生影响
倒数第四行的join函数是加入指定符号,这里啥也没有,所以也不会产生影响
直接对脚本进行修改得出答案
import base64,urllib.parse
key = "HereIsFlagggg"
flag = "xxxxxxxxxxxxxxxxxxx"
enc = '%C2%A6n%C2%87Y%1Ag%3F%C2%A01.%C2%9C%C3%B7%C3%8A%02%C3%80%C2%92W%C3%8C%C3%BA'
flag = urllib.parse.unquote(enc) #URL解码
s_box = list(range(256))
j = 0
for i in range(256):
j = (j + s_box[i] + ord(key[i % len(key)])) % 256
s_box[i], s_box[j] = s_box[j], s_box[i]
res = []
i = j = 0
for s in flag:
i = (i + 1) % 256
j = (j + s_box[i]) % 256
s_box[i], s_box[j] = s_box[j], s_box[i]
t = (s_box[i] + s_box[j]) % 256
k = s_box[t]
res.append(chr(ord(s) ^ k))
#cipher = "".join(res) join:将字符串以指定符号分隔
#crypt = (str(base64.b64encode(cipher.encode('utf-8')), 'utf-8')) 进行了一次base64加密
#enc = str(base64.b64decode(crypt),'utf-8') 进行了一次base64解密
#enc = urllib.parse.quote(enc) URL编码
#print(enc)
# enc = %C2%A6n%C2%87Y%1Ag%3F%C2%A01.%C2%9C%C3%B7%C3%8A%02%C3%80%C2%92W%C3%8C%C3%BA
for h in res:
print(h,end='')
[SWPUCTF 2021 新生赛]re2
为应用程序,先查壳
无壳,64位,使用ida64打开,反汇编
分析一下,即如果Str1,字符对应ascii码<=96或>98,<=64或>66,就-2,否则+24,再将结果与Str2比较,一样则成功
逆向写出代码如下:
str = "ylqq]aycqyp{"
flag = ""
for i in range(0, len(str)):
if ((ord(str[i]) <= 96 | ord(str[i]) > 98)) | ((ord(str[i]) <= 64 | ord(str[i]) > 66)):
flag += chr(ord(str[i]) + 2)
else:
flag += chr(ord(str[i]) - 24)
print(flag)
运行出的结果为{nss_c{es{r},有点奇怪,提交之后也确实不对,查了一下,发现是将{换成了a
NSSCTF{nss_caesar}