BUUCTF

[ACTF新生赛2020]easyre

用ida分析,找一下主类

image-20250430110834014

来看下代码逻辑

# 首先将"*F'\"N,\"(I?+@"复制到v4里面
v4 = "*F'\"N,\"(I?+@"
# 用户输入v6

然后我们看下_data_start__

image-20250430111250661

可以发现这里有一个字符串,提取一下

~}|{zyxwvutsrqponmlkjihgfedcba`_^]\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(\'&%$# !"

这样的话思路就有了,定义v4和data_start,然后遍历v4,然后在data中找与v4中的元素一样的元素位置+1的位置(v5是用来查找位置的一个数组,里面存放的v7 v8 v9都是匿名内存地址)

所以编写一下解密脚本

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?}

简单注册器

拿到一个apk,用jadx分析下
image-20250430122619237

需要解密的代码段就是这个

if (flag == 1) {
                    char[] x = "dd2940c04462b4dd7c450528835cca15".toCharArray();
                    x[2] = (char) ((x[2] + x[3]) - 50);
                    x[4] = (char) ((x[2] + x[5]) - 48);
                    x[30] = (char) ((x[31] + x[9]) - 48);
                    x[14] = (char) ((x[27] + x[28]) - 97);
                    for (int i = 0; i < 16; i++) {
                        char a = x[31 - i];
                        x[31 - i] = x[i];
                        x[i] = a;
                    }
                    String bbb = String.valueOf(x);
                    textview.setText("flag{" + bbb + "}");
                    return;
                }

按照这个走一遍,编写解密脚本

x = list("dd2940c04462b4dd7c450528835cca15")
a = ''

x[2] = chr(ord(x[2]) + ord(x[3]) - 50)
x[4] = chr(ord(x[2]) + ord(x[5]) - 48)
x[30] = chr(ord(x[31]) + ord(x[9]) - 48)
x[14] = chr(ord(x[27]) + ord(x[28]) - 97)

#反转字符
x[:] = x[::-1]
    
bbb = ''.join(x)
print("flag{" + bbb + "}")

得到flag{59acc538825054c7de4b26440c0999dd}

[GWCTF 2019]pyre

下载附件后我们会得到一个pyc文件,需要我们使用uncompyle6来反编译一下

print("Welcome to Re World!")
print("Your input1 is your flag~")

input1 = input()

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,把code逆向回input1

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]))

print(code)

for i in range(len(code)):
    # num = (input1[i] + i) % 128
    num = chr((ord(code[i]) - i) % 128)
    flag += num

print(flag)

得到flag{Just_Re_1s_Ha66y!}

moeCTF

Android_Cracker

得到附件,是一个apk

使用jadx打开,找到主类

image-20250429215603307

明文直接出

moectf{Andr01d_1s_so00oo_e@sy_t0_cr4ck!!!}

Art

拿到一个程序,先用小蓝盒分析一下
image-20250429215857315

发现有壳,是upx,那我们脱一下壳

image-20250429220002898

放入IDA中分析

image-20250429220223739

可以看到正确答案是一个长度为28的字符串

先实现对这段代码逻辑的一个逆向