easy-UPX

141次阅读
没有评论

easy-UPX

程序用IDA打开之后提示可能被混淆,并且能看见的函数少之又少,初步怀疑被加壳

直接UPX -d 脱壳处理

进入main

easy-UPX

程序逻辑分析:
整型变量 v3 v5 i
字符串型变量v4
两个字符串 encoded original

从标准输入 cin 读入一段字符串,写入到 original
用了 std::string::length 和 std::string::c_str,即确认输入 original 的长度,提取出指向 original 字符串的 C 风格指针

将v3进行base64加密 结果放在encoded当中

起循环 v5 = i
若 i 比 源字符串的长度大就跳出循环
v4对加密过后的结果进行切片操作
随后逐个进行判断 与str比较

清理资源并退出
调用 C++ 析构函数释放 std::string。

寻找 str:

easy-UPX

IzyxLKW2IIOLpQEwnmAxsD9X

不对劲,这真的是base64吗?为什么解密出来全是乱码

查阅字符串,找到一个奇怪的字符串

easy-UPX

根据观察这是经历过rot13变化过后的base64字符集

easy-UPX

因此构造payload

import base64

# 程序里的自定义表(ROT13过的base64)
custom_table = "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm9876543210+/"

# 标准base64表
standard_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

# 构造映射表: 自定义表 → 标准表
trans_table = str.maketrans(custom_table, standard_table)

# 程序内置的目标字符串(从IDA拿到完整的str)
s = "IzyxLKW2IIOLpQEwnmAxsD9X"

# 第一步:把自定义base64结果转换为标准base64
std_b64 = s.translate(trans_table)

# 第二步:正常base64解码
decoded = base64.b64decode(std_b64)

print("转换过的标准Base64:", std_b64)
print("解码得到的原始输入:", decoded)

FLAG Vidar{UPXp4ck3d}

正文完
 0
评论(没有评论)