天天看点

BUUCTF-Reverse

文章目录

    • 不一样的flag
    • SimpleRev
    • Java逆向解密
    • [GXYCTF2019]luck_guy
    • findit
    • [BJDCTF2020]JustRE
    • [GWCTF 2019]pyre

不一样的flag

ida打开,进入main函数

BUUCTF-Reverse

分析发现是个迷宫题,要从*走到#,中间碰到1就结束

1 up

2 down

3 left

4 right

所以flag:

SimpleRev

ida64打开,进入main函数

BUUCTF-Reverse

主函数仅仅是判断我们输入的是否为 d/D 如果是,则进去Decry()函数,否则退出

跟进Decry()函数

BUUCTF-Reverse

strcpy()函数是将key1拷贝到key中,而strcat()函数是将src拼接到key后(按小端序拼接)

所以 key == ADSFKNDCLS

这里的text是用来接收key3和v9经join()函数处理后的值,进去join()函数

BUUCTF-Reverse

a1=key3,a2=v9

dest = (char *)malloc(v2 + v3 + 1);申请了一个堆dest用来存放key3,v9

最后返回的dest就是key,v9的拼接

因此 text = killshadow

再往下看,这里是将key进行了一个大写变小写的操作,key = adsfkndcls

BUUCTF-Reverse

这里就是核心了也就是对你输入的字符进行处理

BUUCTF-Reverse

在判断输入字符的大小写之后,分别对输入的字符进行处理变换后存入一个数组,

循环结束后,将数组与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打开

BUUCTF-Reverse

函数的逻辑就是输入一个字符串,加上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函数

BUUCTF-Reverse

进去patch_me()这个函数,这里限制了输入的数字必须为偶数

BUUCTF-Reverse

进入get_flag()

BUUCTF-Reverse

将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打开发现一段十六进制的数

BUUCTF-Reverse

转字符:

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/

BUUCTF-Reverse

[BJDCTF2020]JustRE

ida打开,Shift+F12查看字符串

BUUCTF-Reverse

有一个类似flag的字符串,点进相关的函数

BUUCTF-Reverse

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)

           

继续阅读