攻防世界——re2-cpp-is-awesome

64位

我先用虚拟机跑了一下这个程序,结果输出一串字符串+flag  ——没用

IDA打开后 F5也没有什么可看的

那我们就F12查看字符串找可疑信息

这里一下就看见了

__int64 __fastcall main(int a1, char **a2, char **a3)
{
  char *v3; // rbx
  __int64 v4; // rax
  __int64 v5; // rdx
  __int64 v6; // rax
  __int64 v7; // rdx
  _BYTE *v8; // rax
  __int64 v10[2]; // [rsp+10h] [rbp-60h] BYREF
  char v11[47]; // [rsp+20h] [rbp-50h] BYREF
  char v12; // [rsp+4Fh] [rbp-21h] BYREF
  __int64 v13; // [rsp+50h] [rbp-20h] BYREF
  int v14; // [rsp+5Ch] [rbp-14h]

  if ( a1 != 2 )
  {
    v3 = *a2;
    v4 = std::operator<<<std::char_traits<char>>(&std::cout, "Usage: ", a3);
    v6 = std::operator<<<std::char_traits<char>>(v4, v3, v5);
    std::operator<<<std::char_traits<char>>(v6, " flag\n", v7);
    exit(0);
  }
  std::allocator<char>::allocator(&v12, a2, a3);
  std::string::basic_string(v11, a2[1], &v12);
  std::allocator<char>::~allocator(&v12);
  v14 = 0;
  v10[0] = std::string::begin(v11);
  while ( 1 )
  {
    v13 = std::string::end(v11);
    if ( !(unsigned __int8)sub_400D3D(v10, &v13) )
      break;
    v8 = (_BYTE *)sub_400D9A(v10);
    if ( *v8 != off_6020A0[dword_6020C0[v14]] )
      sub_400B56();
    ++v14;
    sub_400D7A(v10);
  }
  sub_400B73();
  std::string::~string(v11);
  return 0LL;
}

这个就是我们运行程序得到的东西

正常来说

这个while(1)和if里面比较关键——经验之谈,你们也可以联想一下写过的

先看第一个sub

bool __fastcall sub_400D3D(__int64 a1, __int64 a2)
{
  __int64 v2; // rbx

  v2 = *(_QWORD *)sub_400DAC(a1);
  return v2 != *(_QWORD *)sub_400DAC(a2);
}
__int64 __fastcall sub_400DAC(__int64 a1)
{
  return a1;
}

 ...就是一个比较函数

按N改名

__int64 __fastcall sub_400D9A(__int64 a1)
{
  return *(_QWORD *)a1;
}

第二个函数,就是一个复制,姑且叫他get吧

_QWORD *__fastcall sub_400D7A(_QWORD *a1)
{
  ++*a1;
  return a1;
}

 最后这个也是一个简单的++操作

最后就是这样了

关键的关键就是if

off就是我们之前找到的那个字符串

dword就是一串数据

我们先脚本走下

a=[36,   0,   0,   0,   0,   0,   0,   0,   5,   0,
    0,   0,  54,   0,   0,   0, 101,   0,   0,   0,
    7,   0,   0,   0,  39,   0,   0,   0,  38,   0,
    0,   0,  45,   0,   0,   0,   1,   0,   0,   0,
    3,   0,   0,   0,   0,   0,   0,   0,  13,   0,
    0,   0,  86,   0,   0,   0,   1,   0,   0,   0,
    3,   0,   0,   0, 101,   0,   0,   0,   3,   0,
    0,   0,  45,   0,   0,   0,  22,   0,   0,   0,
    2,   0,   0,   0,  21,   0,   0,   0,   3,   0,
    0,   0, 101,   0,   0,   0,   0,   0,   0,   0,
   41,   0,   0,   0,  68,   0,   0,   0,  68,   0,
    0,   0,   1,   0,   0,   0,  68,   0,   0,   0,
   43,   0,   0,   0]
b=[]
for i in range(0,len(a),4):
    b.append(a[i])
print(b)
a='L3t_ME_T3ll_Y0u_S0m3th1ng_1mp0rtant_A_{FL4G}_W0nt_b3_3X4ctly_th4t_345y_t0_c4ptur3_H0wev3r_1T_w1ll_b3_C00l_1F_Y0u_g0t_1t'
flag=''
for i in b:
    flag+=a[i]
print(flag)

结果就出来了

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_Nickname

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

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

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

打赏作者

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

抵扣说明:

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

余额充值