NSSCTF [HNCTF 2022 WEEK2]e@sy_flower

将文件拖入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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值