文章目录
-
- 不一样的flag
- SimpleRev
- Java逆向解密
- [GXYCTF2019]luck_guy
- findit
- [BJDCTF2020]JustRE
- [GWCTF 2019]pyre
不一样的flag
ida打开,进入main函数
分析发现是个迷宫题,要从*走到#,中间碰到1就结束
1 up
2 down
3 left
4 right
所以flag:
SimpleRev
ida64打开,进入main函数
主函数仅仅是判断我们输入的是否为 d/D 如果是,则进去Decry()函数,否则退出
跟进Decry()函数
strcpy()函数是将key1拷贝到key中,而strcat()函数是将src拼接到key后(按小端序拼接)
所以 key == ADSFKNDCLS
这里的text是用来接收key3和v9经join()函数处理后的值,进去join()函数
a1=key3,a2=v9
dest = (char *)malloc(v2 + v3 + 1);申请了一个堆dest用来存放key3,v9
最后返回的dest就是key,v9的拼接
因此 text = killshadow
再往下看,这里是将key进行了一个大写变小写的操作,key = adsfkndcls
这里就是核心了也就是对你输入的字符进行处理
在判断输入字符的大小写之后,分别对输入的字符进行处理变换后存入一个数组,
循环结束后,将数组与text对比,相同则输出 Congratulation!
脚本:
key = 'adsfkndcls'
text = 'killshadow'
s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
flag = ""
for i in range(len(key)):
for j in s:
if ord(text[i]) == (ord(j) - 39 - ord(key[i]) + 97) % 26 + 97:
flag += j
print(flag)
Java逆向解密
下载附件打开是一个.class文件,用jd-gui打开
函数的逻辑就是输入一个字符串,加上64与0x20异或后与KEY比较
脚本:
key = [ 180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65 ]
flag = ""
for i in range(len(key)):
flag += chr(key[i] - 64 ^ 0x20)
print(flag)
[GXYCTF2019]luck_guy
ida64打开,找到main函数
进去patch_me()这个函数,这里限制了输入的数字必须为偶数
进入get_flag()
将f1,f2拼接起来就是flag了,但f2不能转换为字符串
注意一下case5的代码,对长度为8的字符串进行了操作,f2(0x7F666F6067756369两位一划分)的长度正好也是8,猜测用来与f1进行拼接形成flag的字符串是f2进行了case5操作后的数据
脚本:
f1 = "GXY{do_not_"
f2 = [0x7F,0x66,0x6F,0x60,0x67,0x75,0x63,0x69][::-1]
s = ""
for i in range(len(f2)):
if i%2 == 1:
s = chr(f2[i] - 2)
else:
s = chr(f2[i] -1)
f1 += s
print(f1)
findit
ApkIDE打开发现一段十六进制的数
转字符:
flag=[0x70,0x76,0x6b,0x71,0x7b,0x6d,0x31,0x36,0x34,0x36,0x37,0x35,0x32,0x36,0x32,0x30,0x33,0x33,0x6c,0x34,0x6d,0x34,0x39,0x6c,0x6e,0x70,0x37,0x70,0x39,0x6d,0x6e,0x6b,0x32 ,0x38,0x6b,0x37,0x35,0x7d]
res=""
for i in range(len(flag)):
res+=chr(flag[i])
print(res)
得到这个
凯撒解密一下
http://ctftools.com/down/
[BJDCTF2020]JustRE
ida打开,Shift+F12查看字符串
有一个类似flag的字符串,点进相关的函数
19999和0填入到里面的%d位置,得到flag
[GWCTF 2019]pyre
附件是一个.pyc文件,在线反编译就能看到源代码了
https://tool.lu/pyc/
print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1)
for i in range(l):
num = ((input1[i] + i) % 128 + 128) % 128 #num = (input1[i] + i) % 128
code += num
for i in range(l - 1):
code[i] = code[i] ^ code[i + 1]
print code
code = [
'\x1f',
'\x12',
'\x1d',
'(',
'0',
'4',
'\x01',
'\x06',
'\x14',
'4',
',',
'\x1b',
'U',
'?',
'o',
'6',
'*',
':',
'\x01',
'D',
';',
'%',
'\x13']
将我们输入的flag进行一个取模操作和异或之后得到code数组
逆回去就好了
code = ['\x1f','\x12','\x1d','(','0','4','\x01','\x06','\x14','4',',','\x1b','U','?','o','6','*',':','\x01','D',';','%','\x13']
flag = ""
for i in range(len(code)-2,-1,-1):
code[i] = chr(ord(code[i]) ^ ord(code[i+1]))
for j in range(len(code)):
flag += chr((ord(code[j])-j) % 128)
print(flag)