Buuoj reverse
简单刷两道吧。
[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}