将文件拖入ida 就看到很显眼的花指令
对着jmp指令nop掉
将main函数按p定义 F5查看伪c代码
思路就是输入的flag先互换位置,再与0x30异或。
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
signed int v3; // 存储临时值
int i; // 循环计数器
char v5; // 临时存储变量
unsigned int j; // 循环计数器
int v7; // 存储比较结果
char v8; // 存储字符
char v9; // 存储字符
char Arglist[48]; // 存储输入的 flag
// 输出提示信息
sub_401020("please input flag\n", v8);
// 读取用户输入到 Arglist 中
sub_401050("%s", (char)Arglist);
v3 = strlen(Arglist);
// 将 Arglist 中相邻字符位置交换
for (i = 0; i < v3 / 2; ++i)
{
v5 = Arglist[2 * i];
Arglist[2 * i] = Arglist[2 * i + 1];
Arglist[2 * i + 1] = v5;
}
// 对 Arglist 中的字符进行异或操作
for (j = 0; j < strlen(Arglist); ++j)
Arglist[j] ^= 0x30u;
// 比较处理后的 Arglist 和特定字符串
v7 = strcmp(Arglist, "c~scvdzKCEoDEZ[^roDICUMC");
if (v7)
v7 = v7 < 0 ? -1 : 1;
// 根据比较结果输出相应信息,并退出程序
if (!v7)
{
sub_401020("yes", v9);
exit(0);
}
else
{
sub_401020("error", v9);
exit(0);
}
}
写出逆向脚本
enc = list('c~scvdzKCEoDEZ[^roDICUMC')
flag = []
# 恢复原位置
for i in range(int(len(enc) / 2)):
tmp = enc[2 * i]
enc[2 * i] = enc[2 * i + 1]
enc[2 * i + 1] = tmp
# 与0x30逆向异或
for i in range(len(enc)):
flag.append(chr(ord(enc[i]) ^ 0x30))
# 输出逆向处理后的flag
for i in flag:
print(i, end='')
得到flag
NSSCTF{Just_junk_Bytess}