NSSCTF 403,444,2145,3845,404,445

[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}

 

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值