BUUCTF Reverse/[ACTF新生赛2020]easyre

BUUCTF Reverse/[ACTF新生赛2020]easyre

在这里插入图片描述

发现UPX壳

在这里插入图片描述

进行脱壳

在这里插入图片描述
在这里插入图片描述

用IDA32位打开,找到main函数进行分析

int __cdecl main(int argc, const char **argv, const char **envp)
{
  _BYTE v4[12]; // [esp+12h] [ebp-2Eh] BYREF
  _DWORD v5[3]; // [esp+1Eh] [ebp-22h]
  _BYTE v6[5]; // [esp+2Ah] [ebp-16h] BYREF
  int v7; // [esp+2Fh] [ebp-11h]
  int v8; // [esp+33h] [ebp-Dh]
  int v9; // [esp+37h] [ebp-9h]
  char v10; // [esp+3Bh] [ebp-5h]
  int i; // [esp+3Ch] [ebp-4h]

  sub_401A10();
  qmemcpy(v4, "*F'\"N,\"(I?+@", sizeof(v4));
  printf("Please input:");
  scanf("%s", v6);
  if ( v6[0] != 65 || v6[1] != 67 || v6[2] != 84 || v6[3] != 70 || v6[4] != 123 || v10 != 125 )
    return 0;
  v5[0] = v7;
  v5[1] = v8;
  v5[2] = v9;
  for ( i = 0; i <= 11; ++i )
  {
    if ( v4[i] != byte_402000[*((char *)v5 + i) - 1] )
      return 0;
  }
  printf("You are correct!");
  return 0;
}

将v6转成字符看看,得到ACTF{

在这里插入图片描述

看一下v10的值,v10 = }

在这里插入图片描述

看到for循环,推测flag在v5中

 for ( i = 0; i <= 11; ++i )
  {
    if ( v4[i] != byte_402000[*((char *)v5 + i) - 1] )
      return 0;
  }

跟进byte_402000,注意看清楚逗号

在这里插入图片描述

注意

从for循环条件中推出flag为12位,但是v4长度有14位。注意v4中的 \" ,这是c语言中的转义字符,只代表一个 "

 for ( i = 0; i <= 11; ++i )
  {
    if ( v4[i] != byte_402000[*((char *)v5 + i) - 1] )
      return 0;
  }
  qmemcpy(v4, "*F'\"N,\"(I?+@", sizeof(v4));

所以得到(在python中字符串有三种表现形式,三个单引号(’’’)、双引号(")、单引号(’))

v4 = '''*F'"N,"(I?+@'''

然后得到(python中 \ 要用 \\ 表示,详情请看这个Python中关于反斜杠(\)用法的总结

by = '''~}|{zyxwvutsrqponmlkjihgfedcba`_^]\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)

然后写出脚本

by = '''~}|{zyxwvutsrqponmlkjihgfedcba`_^]\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$# !"'''
v4 = '''*F'"N,"(I?+@'''

for i in range(len(v4)):
    for j in range(len(by)):
        if  v4[i] == by[j]:
            #print("v5[{}] - 1 = {} ,v5[{}] = {} ".format(i,j,i,chr(j + 1)))
            print(chr(j + 1),end = '')

运行得到结果

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ofo300

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值