攻防世界逆向-hello CTF

攻防世界逆向-hello CTF

在这里插入图片描述
无聊的exe文件,不过main函数很清晰,没有被隐藏在这里插入图片描述
想尝试将奇怪的一串数字化为字符串而得到flag,未果,转换完还是这样子的
那么我们只能悲催的继续分析伪代码,看不懂就硬看

 memcpy(&v22, "437261636b4d654a757374466f7246756e", 0x20u);
  v23 = *(_WORD *)"6e";
  v24 = a437261636b4d65[34];
  while ( 1 )
  {memset(&v19, 0, 0x20u);
    v20 = 0;
    v21 = 0;
    sub_40134B("please input your serial:", v15);
    scanf("%s", v18);
    if ( strlen(v18) > 0x11 )
      break;
    v3 = 0;
    do
    {
      v4 = v18[v3];
      if ( !v4 )
        break;
      sprintf(&Dest, "%x", v4);
      v5 = &Dest;
      v6 = -1;
      do
       {
      v4 = v18[v3];
      if ( !v4 )
        break;
      sprintf(&Dest, "%x", v4);
      v5 = &Dest;
      v6 = -1;
      do
      {
        if ( !v6 )
          break;
        v7 = *v5++ == 0;
        --v6;
      }
        while ( !v7 );
      v8 = ~v6;
      v9 = &v5[-v8];
      v10 = v8;
      v11 = &v19;
      v12 = -1;
      do
      {
        if ( !v12 )
          break;
        v7 = *v11++ == 0;
        --v12;
      }
        while ( !v7 );
      v13 = v11 - 1;
      memcpy(v13, v9, 4 * (v10 >> 2));
      ++v3;
      memcpy((char *)v13 + 4 * (v10 >> 2), (char *)v9 + 4 * (v10 >> 2), v10 & 3);
    }
    while ( v3 < 17 );
    if ( strcmp(&v19, &v22) )
      sub_40134B("wrong!\n", v15);
    else
      sub_40134B("success!\n", v15);
  }
  sub_40134B("wrong!\n", v16);
  result = File._cnt-- - 1;
  if ( File._cnt < 0 )
    result = _filbuf(&File);
  else
    ++File._ptr;
  return result;
}

于是我尝试读懂这串奇怪的数字

memcpy(&v22, "437261636b4d654a757374466f7246756e", 0x20u);

memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void *destin, void *source, unsigned n);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。
所以v22的地址里面存的值就是这串奇怪的数字
在这里插入图片描述
很巧,在输出flag成功或者失败的时候,有v22和v19比较,这函数我也不懂,所以一定要多记住啊,这就是书到用时方恨少的感觉吧,我搜函数意思的时候可能人家就拿了一血了。。

strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
在这里插入图片描述
输入的东西传入了v18
scanf()是C语言中的一个输出函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h>。(在有一些实现中,printf函数与scanf函数在使用时可以不使用预编译命令#include <stdio.h>。)它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。

在这里插入图片描述
所以是输入不能超过17位,不然程序就退出了
437261636b4d654a757374466f7246756e
观察这串奇怪的数字,我坚信他一定是flag的导火线,发现是由数字和字母组成的,且最大字母是e,十六进制里面最大字母是f,所以我有一种直觉,这是一串十六进制转换到字符串就能得到flag
使用在线十六进制到文本字符串的转换器
在这里插入图片描述
当当!得到flag了,这应该是zui简单的题了吧,我做的很开心,希望比赛也是这种题,让大家都拿一下分,别跟强x杯似的,出的题都死难死难的,直接放弃了。

附上:十六进制是怎么转成字符串的,因为16进制对应的字符的ASCII码都是两位两位的,所以可以从一个大长串数字转换为字符串。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值