Buuoj re [[ACTF新生赛2020]easyre|findit|rsa|[ACTF新生赛2020]rome]

简单刷两道吧。

[ACTF新生赛2020]easyre

32位pe文件,加upx壳,脱壳

.\upx.exe -d easyre.exe

在这里插入图片描述

ida分析

在这里插入图片描述
分析需要输入字符串满足ACTF{v5}这个格式。因为v7,v8,v9为int型,因此有12个字节,接下来的一个循环便是来定义这个v5。在v4中有十二个字符分别对应以v5-1为索引的data字符串,写个逆向脚本

data = '~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(\'&%$# !"'
v4="*F'\"N,\"(I?+@"
flag = ''
for i in v4:
    flag+=chr(data.find(i)+1)
print(flag)

flag{U9X_1S_W6@T?}

findit

java反编译出来的看的真舒服

在这里插入图片描述

直接查看最后输出的是y数组,所以不需要管x数组如何变换,然后分析其变换代码,大意是将b数组中的A~Z和a~z进行处理,因此简单写个脚本

y=['p', 'v', 'k', 'q', '{', 'm', '1', '6', '4', '6', '7', '5', '2', '6', '2', '0', '3', '3', 'l', '4', 'm', '4', '9', 'l', 'n', 'p', '7', 'p', '9', 'm', 'n', 'k', '2', '8', 'k', '7', '5', '}']

for i in range(38):
    if (ord(y[i])>=ord('A') and ord(y[i])<=ord('Z')) or (ord(y[i])>=ord('a') and ord(y[i])<=ord('z')):
        y[i]=chr(ord(y[i])+16)
        if ((ord(y[i])>ord('Z'))and(ord(y[i])<ord('a'))or(ord(y[i])>=ord('z'))):
            y[i]=chr(ord(y[i])-26)

print("".join(y))

flag{c164675262033b4c49bdf7f9cda28a75}

rsa

打开文件有两个

在这里插入图片描述

之前没做过,果断查看大佬wp
主要是使用rsa进行解密,本文就不讲基本原理,只讲方法了。

首先查看pub.key的内容

在这里插入图片描述

在这个网址查看公钥内包含的n和e

在这里插入图片描述
然后在这个网站分解n(换为10进制),获得p和q(用于计算d)

在这里插入图片描述
获得全部信息写个脚本就完事了

import rsa
import gmpy2

n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
e = 65537
p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463

d = gmpy2.invert(e,(p-1)*(q-1))
private = rsa.PrivateKey(n,e,int(d),p,q)

with open(r'D:\Downloads\41c4e672-98c5-43e5-adf4-49d75db307e4\output\flag.enc','rb') as f:
    print(rsa.decrypt(f.read(),private).decode())

flag{decrypt_256}

[ACTF新生赛2020]rome

32位pe

在这里插入图片描述
又是一个纯静态分析,还是要考虑全面周到,不如容易出小错误。

首先判断其需要输入字符串,也就是flag,前五个和后一个满足特定格式,中间的则是flag本体。其中v12[17]其实就是变量i,之后就好理解了,对A~Z和a~z做特定运算,其中要注意%运算,其在逆向的时候很烦。最后变换后的flag与题中的v12字符串相等,所以逆向的时候,就先从相等开始推到输入的flag

v12 = "Qsw3sj_lz4_Ujw@l"
v1 = list(v12)
for i in range(16):
    if ord(v1[i])>64 and ord(v1[i])<=90:
        v1[i]=chr(ord(v1[i])-65+51) if (ord(v1[i])-65+51)>64 else chr(ord(v1[i])-65+26+51)
    if ord(v1[i]) > 96 and ord(v1[i]) <= 122:

        v1[i]= chr(ord(v1[i]) - 97 + 79) if (ord(v1[i])-97+79)>96 else chr(ord(v1[i])-97+26+79)
print("".join(v1))

flag{Cae3ar_th4_Gre@t}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值