BUUCTF-reverse
easyre
reverse1
reverse2
fl0g = '{hacking_for_fun}'
flag = list(fl0g)
for i in range(len(flag)):
if ord(flag[i]) == 105 or ord(flag[i]) == 114:
flag[i] = chr(49)
print(flag[i],end='')
#{hack1ng_fo1_fun}
内涵的软件
后来我菜发现得把v2里面的DBAPP换成flag菜可以是正确的flag!
新年快乐
此时再次使用EP进行探测发现没有了壳!
helloword
此时便是安卓逆向了!
xor
flag = [0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, 0x40, 0x11,
0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, 0x70, 0x19, 0x46, 0x1F,
0x76, 0x22, 0x4D, 0x23, 0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F,
0x47, 0x32, 0x4F]
print(chr(flag[0]),end='')
for i in range(1,33):
f = flag[i] ^ flag[i-1]
print(chr(f),end='')
#flag{QianQiuWanDai_YiTongJiangHu}
reverse3
然后通过分析发现关键函数可能是base64加密!
这是很明显的特征!
这里便是最后进行比较的数据啦!
不够在这两个中间还有个小小的变换!
fl0g = [0x65, 0x33, 0x6E, 0x69, 0x66, 0x49, 0x48, 0x39, 0x62, 0x5F,
0x43, 0x40, 0x6E, 0x40, 0x64, 0x48]
for i in range(len(fl0g)):
fl0g[i] -= i
print(chr(fl0g[i]),end='')
然后进行base64进行解密!
{i_l0ve_you}
不一样的flag
根据这个!
有很大的概率是迷宫题,所以外面需要进行找到最佳路径!像这种题,其实爆破是应该是最快的!
'''
1 --v4
2 ++v4
3 --v5
4 ++v5
*11110100001010000101111#
'''
mize = '*11110100001010000101111#'
#print(len(mize))
for i in range(5):
for j in range(5):
print(mize[i*5+j],end='')
print()
‘’‘
*1111
01000
01010
00010
1111#
’‘’
flag{222441144222}
SimpleRev
一个游戏,按d启动!q退出!
这里有两个数据,还有两个十六进制的字符串!
这里其实就可以直接写个脚本了!
text = "killshadow"
key = "adsfkndcls"#这里我手动把它改成了小写字母!
v5 = len(key)
for i in range(len(key)):
for j in range(65,91):#注:这里不可以是90,否则不对
if ord(text[i]) == (j - 39 - ord(key[i % v5]) + 97) % 26 + 97:
print(chr(j),end='')
break
#flag{KLDQCUDFZO}
Java逆向解密
这个是class文件,不是apk文件,当时我还在想,使用apk逆向软件能不能逆向成功,成功了!
很简单的一道题!
data = [180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65]
for i in data:
flag = (i ^ 32) - ord('@')
print(chr(flag),end='')
#This_is_the_flag_!
刮开有奖
这道题还是有点诧异的!
此时用ida打开看看!
这个一看是没有输入的,而题目说是输入的解释正确答案?所以在ida中找找,发现一个疑似flag的地方!
然我们进去这个函数中看看!
所以此时我们就应该进去sub_401000该函数中进行分析!
这里是凭借经验来进行判断的!
不过经过一番试错后,发现这样子得到flag是不对的,说明我们遗落了什么!
所以我们进去看看,发现有点复杂!我们可以使用C语言进行改进并编写一下,看看其逻辑是什么?
#include<stdio.h>
#include<string.h>
int sub(char a1[],int a2,int a3)
{
int result; // eax
int i; // esi
int v5; // ecx
int v6; // edx
result = a3;
for ( i = a2; i <= a3; a2 = i )
{
v5 = i;
v6 = a1[i];
if ( a2 < result && i < result )
{
do
{
if ( v6 > a1[result] )
{
if ( i >= result )
break;
++i;
a1[v5] = a1[result];
if ( i >= result )
break;
while ( a1[i] <= v6 )
{
if ( ++i >= result )
goto LABEL_13;
}
if ( i >= result )
break;
v5 = i;
a1[result] = a1[i];
}
--result;
}
while ( i < result );
}
LABEL_13:
a1[result] = v6;
sub(a1, a2, i - 1);
result = a3;
++i;
} //printf("%s\n",a1);
return result;
}
int main()
{
char a1[20] = "ZJSECaNH3ng";
int i;
i = sub(a1,0,10);
printf("%s\n",a1);
return 0;
}
//3CEHJNSZagn
所以沉此时我们才可以找到正确的flag!
所以前两个字符就可以找到正确的了,而后面每3个一组的字符串进行base64解密!
flag{UJWP1jMp}
[GXYCTF2019]luck_guy
这道题粗略的看了看,感觉还是有意思的!
我们就进去看看!
进去看看!
所以此时可以进行写脚本来进行解密了!
f1 = 'GXY{do_not_'
print(f1,end='')
f2 = 'fo`guci'
f2 = f2[::-1]#这里记得倒过来,当时我就忘了,弄了一会儿才反应过来!
for i in range(8):
if i%2 == 1:
v = ord(f2[i]) - 2
else:
v = ord(f2[i]) - 1
print(chr(v),end='')
#GXY{do_not_hate_me}提交时换成flag
findit
此时时apk文件,安卓逆向开始啦!
使用jadx进行反编译!
这里其实我们是不知道我们输入的是flag还是最后输出的是flag,我们此时就先从输入入手!
这里其实是可以直接上脚本,因为加密并不复杂!
a = ['T', 'h', 'i', 's', 'I', 's', 'T', 'h', 'e', 'F', 'l', 'a', 'g', 'H', 'o', 'm', 'e']
x = [0] * 17
for i in range(17):
if (a[i] < 'I' and a[i] >= 'A') or (a[i] < 'i' and a[i] >= 'a'):
x[i] = chr(ord(a[i]) + 18)
elif (a[i] < 'A' or a[i] > 'Z') and (a[i] < 'a' or a[i] > 'z'):
x[i] = a[i]
else:
x[i] = chr(ord(a[i]) - ord('\b'))
print(x[i],end='')
#LzakAkLzwXdsyZgew
这里发现是没有flag的,所以我们下载到模拟器上这个软件,然后输入密码,就得到flag了!
这样我们就不用再看后面的flag加密了!
flag{c164675262033b4c49bdf7f9cda28a75}
简单注册器
又来了个apk文件,又是安卓逆向!
这里我们可以是写脚本找出flag,也可以找出一种符号条件的进入软件!
a = chr(int((56 + 48)/2))
for i in range(32):
if i == 1:
print('b',end='')
elif i == 31:
print('a',end='')
elif i == 0 or i == 2:
print(a,end='')
else:
print('1',end='')
#4b41111111111111111111111111111a
找到了一种可以通过判断的数据,输入进去就可以得到flag了!
flag{59acc538825054c7de4b26440c0999dd}
[BJDCTF2020]JustRE
这道题是个exe文件!
挺有意思的!这个直接ida就会发现它的主要逻辑!
然后我们直接看这个输出的是什么?
然后我们将那两个%d替换成19999和0就是flag了!
flag{199990d2069a45792d233ac}
[GWCTF 2019]pyre
发现是个pyc文件!直接使用EasyPython反汇编软件!就直接得到源码了!
# Embedded file name: encode.py
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
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']
所以我们便可以根据这个进行写解密代码了!
code = ['\x1f','\x12','\x1d','(','0','4','\x01','\x06','\x14','4',
',','\x1b','U','?','o','6','*',':','\x01','D',';','%',
'\x13']
t = len(code) - 2
while t >= 0:
code[t] = chr(ord(code[t]) ^ ord(code[t + 1]))
t -= 1
for i in range(len(code)):
for j in range(127):
if ord(code[i]) == ((j + i) % 128 + 128) % 128:
print(chr(j),end='')
break
#GWHT{Just_Re_1s_Ha66y!}
这样子就得到flag了!
flag{Just_Re_1s_Ha66y!}
rsa(未做)
看起来是个rsa算法,这个确实我并不会,所以先放下!
CrackRTF(未做完)
这个也是一个exe文件!同样使用ida进行打开!
逻辑比较简单!
此时我们就可以分析一下了!这两个函数其实是一样的!
这个%02x确实不知道,不过我们可以用C语言进行实验,看看这个东东是个什么?
此时通过一个简单是实验发现就是将字母弄成2位的十六进制数(本质上是ASCll码)
这里忽略了一个函数,就是上面的Hash函数,到下面估计就是MD5了!所以失败了!故我们再看看代码!
此时我们再进去看看!
接着进!
到这里确实不知道怎么做了!先放这儿!
[ACTF新生赛2020]easyre
加了个upx的壳,直接在kali中去壳!
去完壳后就可以ida看主函数了!
这时就可以写脚本了!
data = r"}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(" + chr(0x27) + r'&%$# !"'
v4 = [42,70,39,34,78,44,34,40,73,63,43,64]
for i in range(12):
for j in range(len(data)):
if ord(data[j - 1]) == v4[i]:
print(chr(j+1),end='')
break
#U9X1SW6@T?
flag{U9X_1S_W6@T?}
[2019红帽杯]easyRE
没有加壳!
这里其实就个异或,然后我们可以开始写脚本了!
data = "Iod1>Qnb(ocy y.i d`3w}wek9{iy=~yL@"
v4 = len(data)
for i in range(v4):
flag = ord(data[i]) ^ i
print(chr(flag),end='')
#Inf2:The fir,t f0ur chars are `fla
前四个字符是flag,果然没有那么简单!
然后我就进了一堆解密,解出个https://bbs.pediy.com/thread-254172.htm网站!
这几个地方都是坑人的,所以我们在重新的看看逻辑!
然后再base64那堆字符串前面一个地方的下面有一个字符串,进行追踪可以找到正确flag的所在地!
data = [0x40, 0x35, 0x20, 0x56, 0x5D, 0x18, 0x22, 0x45, 0x17, 0x2F,
0x24, 0x6E, 0x62, 0x3C, 0x27, 0x54, 0x48, 0x6C, 0x24, 0x6E,
0x72, 0x3C, 0x32, 0x45, 0x5B]
flag = [102,108,97,103]
for i in range(4):
flag[i] = flag[i] ^ data[i]
for i in range(25):
f = data[i] ^ flag[i % 4]
print(chr(f),end='')
#flag{Act1ve_Defen5e_Test}
[FlareOn4]login
这道题有点意思,其实还是比较简单的!
打开是个html!直接可以看到源码,通过分析,可以发现是
通过这个其实是可以进行开始编写脚本的!
var flag = "PyvragFvqrYbtvafNerRnfl@syner-ba.pbz";
var rotFlag = flag.replace(/[a-zA-Z]/g, function(c){return String.fromCharCode((c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);});
alert(rotFlag);
这个加密是rot13加密,
ClientSideLoginsAreEasy@flare-on.com
相册
这道题有意思,是个apk,同样也是个病毒。不错!直接jadx逆向:
上个源码看看!
然后发现new的里面是没有我们想要的flag,那么,我们就从方法入手,还是上图,从c2的方法再来追踪一番!探索探索!
发现了 C2.MAILFROME 这个是比较特殊!
平且我进去NativeMethod.m()发现是空的,所以这里猜测是进入ida去分析了!
NativeMethod代表是java引用外部的代码
18218465125@163.com