【极客大挑战2023】RE方向 WriteUp

1.砍树

下载题目得到一个apk文件,jadx打开,查看Android.Manifest.xml
image
查看MainActivity
image
发现使用了一个I0o0I处理了输入和Syclover,猜测应该是对text处理后与Syclover对比,当result赋值为1就成功了。故查看I0o0I
image
发现I0o0I再so文件中,故查看libezreeeee.so文件
IDA打开,查找I0o0I
image
生成伪代码并修改一些可以分辨的函数
image

在 函数中

text[i] ^= syclover[i % 7];
syc = Sycloverforerver实际上只被用到了前6个字符

解题脚本

点击查看代码
#include <stdio.h>
#include <string.h>

int main(void) {
    unsigned char text[40]; 
    unsigned char syc[20] = "Sycloverfover";
    unsigned char dest[36] = { 
        0x00, 0x20, 0x20, 0x17, 0x1B, 0x36, 0x0E, 0x36, 
        0x26, 0x17, 0x04, 0x2A, 0x29, 0x07, 0x26, 0x15, 
        0x52, 0x33, 0x2D, 0x0F, 0x3A, 0x27, 0x11, 0x06, 
        0x33, 0x07, 0x46, 0x17, 0x3D, 0x0A, 0x3C, 0x38, 
        0x2E, 0x22, 0x18 
    };


    for (int i = 0; i < 35; ++i) { 
        text[i] = dest[i] ^ syc[i % 7]; 
    }


    printf("Recovered text: ");
    for (int i = 0; i < 35; ++i) { 
        printf("%c", text[i]);
    }
    printf("\n");

    return 0;
}


2.点击就送的逆向题

这道题给了一个.s文件
解决方案有两个:

1.利用gcc编译成可执行文件,然后反编译生成伪代码

2.直接分析汇编(我不会。。。)

1.利用gcc编译成可执行文件

linux执行gcc -o 1.s 1
IDA打开,分析并编写,注意一定要在字符串末尾加上\0结束符!!!
image

点击查看代码
#include <stdio.h>
int main(void)
{
    char e1[32] = "Z`J[X^LMNO`PPJPVQRSIUTJ]IMNOZKMM";
    char result[33];
    for (int i = 0; i <= 31; i++)
    {
        result[i] = e1[i] - 7;
    }
    result[33] = "\0";
    printf("%s",result);
    return 0;
}

3.幸运数字

解题脚本:

点击查看代码
# 定义 datas 数组
datas = [
    13, 7, 29, 37, 29, 110, 48, 57, 44,
    63, 42, 43, 50, 63, 42, 55, 110, 48,
    48, 48, 48, 45, 1, 7, 49, 43, 1,
    57, 31, 59, 45, 45, 27, 58, 1, 12,
    ord('o'), ord('9'), ord('6'), ord('*'), ord('#')
]

# 计算 result 函数
def result(k):
    if k:
        return result(k - 1) + k
    else:
        return 0

# 生成 flag 的函数
def generate_flag(input_value):
    flag = ""
    v5 = result(input_value) % 211  # 计算 v5
    for v4 in datas:
        flag += chr(v4 ^ v5)  # 生成字符
    return flag

    for input_value in range(1000):  # 遍历所有可能的输入
        flag = generate_flag(input_value)
        # 检查 flag 是否符合特定格式,例如 SYC{}
        if flag.startswith("SYC{") and flag.endswith("}"):
            print(f"找到符合条件的输入值: {input_value}, 生成的 flag: {flag}")
            break


4.小黄鸭

题目给了一个exe文件,IDA打开,发现是Pyinstall打包的软件
image

使用PyInstaller Extractor:https://sourceforge.net/projects/pyinstallerextractor/files/latest/download
python pyinstxtractor.py 1111.exe反编译
image
发现是Python3.7
通过查看其他pyc文件知道Magic Number 是 42 0D
image
发现一直报错,不明原因换一个软件:pyinstxtractor(找到问题了,一定要从github下载!!!)
https://www.cnblogs.com/pcat/p/8990482.html
使用在线工具进行pyc反编译
https://tool.lu/pyc/
image

解题脚本:

点击查看代码
d='~h|p4gs`gJdN`thPwR`jDn`te1w`2|RNH'
flag=''
for i in range(len(d)):
    if d[i].isalpha():
        c=chr(ord(d[i])-2)
        flag+=chr(ord(c) + 13 - 26 if ord(c) + 13 > (90 if c <= 'Z' else 122) else ord(c) + 13)
 
    else:
        flag+=chr(ord(d[i])-1)
print(flag[::-1])
得到`SYC{1_h0pe_yOu_ChAse_YoUr_dr3a{s}` 但是题目中还给了提示:![image](https://img2024.cnblogs.com/blog/2306929/202410/2306929-20241012223056427-689438919.png) 所以倒数第二个字母是m

参考:
https://github.com/MrWQ/reverse_pyinstaller
https://blog.ctftools.com/2022/10/newpost-50/

posted @ 2024-10-04 16:45  vstral  阅读(19)  评论(0编辑  收藏  举报