easy-UPX
程序用IDA打开之后提示可能被混淆,并且能看见的函数少之又少,初步怀疑被加壳
直接UPX -d 脱壳处理
进入main

程序逻辑分析:
整型变量 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:

IzyxLKW2IIOLpQEwnmAxsD9X
不对劲,这真的是base64吗?为什么解密出来全是乱码
查阅字符串,找到一个奇怪的字符串

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

因此构造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}
正文完