buuctf通关10-13
SimpleRev
查壳,发现64位无壳,用64位IDA打开。
join函数
分析伪代码
1.v1是我们输入的flag。
2.进入join函数,分析函数用法可知效果为连接key3和v9,由于v9是char格式读取,要读取要用小端序,即text为killshadow。
3.把key1(ADSFK)的值复制给key,再连接key和src(SLCDN),所以key = ‘ADSFKNDCLS’ (src 为小端序,故读取时要逆序)。
4.通过循环将key数组里ASCll码在64到90的字符都加上32,key字符串变为’adsfkndcls’。
5.比较text和变换后的值str2,如果相等,则我们的输入是正确的flag,通过脚本暴力破解,用带入字母法得到flag。
flag = ''
text = 'killshadow'
key = 'adsfkndcls'
for i in range(len(text)):
for x in range(65,123):
if text[i] == chr((x - 39 - ord(key[i]) + 97) % 26 + 97):
flag += chr(x)
break
print('flag{'+flag+'}')
Java逆向解密
根据题目提示是java语言编写的程序,用jd-gui反编译一下
分析代码
1.我们输入的flag是加密前的字符串,在Encrypt函数中,每个字符加上了一个‘@’,再与32异或。
2.加密后的字符以整型返回存到Resultlist里,key中的数用i(整型)表示后存入KEYList里。
3.如果Resltlist与KEYList相等,即为flag。
用倒推的方式写脚本进行解密,得到flag{This_is_the_flag_!}。
KEY = [180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65]
flag = 'flag{'
x = 0
for i in range(0,len(KEY)):
x = (KEY[i] - ord('@')) ^ 32
flag = flag + chr(x)
print(flag)
[GXYCTF2019]luck_guy 1
查壳,发现64位无壳,用64位IDA打开
shift+F12打开字符串,查找关键信息,ctrl+Tab查看伪代码。
分析代码
1.flag前部分内容,即f1已知,而f2不知,认为是进行了case4和5的操作。
2.case5的操作大致是让字符串中大小为奇数的数减2,偶数减1.
思路明确,进行脚本修复。
flag="GXY{do_not_" #f1内容
f2=[0x7F,0x66,0x6F,0x60,0x67,0x75,0x63,0x69][::-1] #小端序要逆序
for j in range(0,len(f2)):
if j%2==1 :
s=chr(f2[j]-2)
else:
s=chr(f2[j]-1)
flag+=s
print (flag)
对case4的s按h转换成十六进制为0x69,0x63,0x75,0x67,0x60,0x6f,0x66,0x7f(小端序读取顺序)
[BJDCTF2020]JustRE 1
查壳,发现是32位无壳,用32位IDA打开
shift +F12查看字符串,下拉发现一串疑似flag。
ctrl+x,Tab进入伪代码。
19999和0代替两个%d,得到flag{1999902069a45792d233ac}。