攻防世界-Reverse

目录

新手区

insanity

首先用Exeinfo PE查壳

没有壳,用IDA打开,shift+F12直接就可以看见flag.

re1

F5查看伪代码

_mm_storeu_si128((__m128i *)&v5, _mm_loadu_si128((const __m128i *)&xmmword_413E34));
  v7 = 0;
  v6 = qword_413E44;
  v8 = 0;
  printf("欢迎来到DUTCTF呦\n");
  printf("这是一道很可爱很简单的逆向题呦\n");
  printf("输入flag吧:");
  scanf("%s", &v9);
  v3 = strcmp((const char *)&v5, &v9);
  if ( v3 )
    v3 = -(v3 < 0) | 1;
  if ( v3 )
    printf(aFlag_0);
  else
    printf((const char *)&unk_413E90);
  system("pause");
  return 0;
}

_mm_storeu_si128表示可存储128位数据,_mm_loadu_si128表示加载128位数据

_mm_storeu_si128((__m128i *)&v5, _mm_loadu_si128((const __m128i *)&xmmword_413E34));这句话就表示把xmmword_413E34的值赋给v5

后面是一个if语句,v3正确输出aFlag_0,不正确输出unk_413E90

所以我们就看v3是什么

v3 = strcmp((const char *)&v5, &v9);

strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1>str2,则返回正数;若str1<str2,则返回负数。

v9是自己输入的一个数,所以看v5就可以了

双击xmmword_413E34

得到.rdata:00413E34 xmmword_413E34 xmmword 3074656D30633165577B465443545544h

3074656D30633165577B465443545544h转成字符串得到DUTCTF{We1c0met0DUTCTF}

注:%s 表示读字符串,而 %d 表示读整数。

game

试了试,好像只要输入1-8就行,不需要什么顺序。

用IDA打开,shift+F12

双击.rdata:0050B0F0 00000015 C done!!! the flag is

F5查看伪函数,上面都是一大串的char函数和v=…,最下面有个代码比较特别

 for ( i = 0; i < 56; ++i )
  {
    *(&v2 + i) ^= *(&v59 + i);
    *(&v2 + i) ^= 0x13u;
  }
  return sub_45A7BE("%s\n");
}

python写个脚本

a=[123,32,18,98,119,108,65,41,124,80,125,38,124,111,74,49,83,108,94,108,84,6,96,83,44,121,104,110,32,95,117,101,99,123,127,119,96,48,107,71,92,29,81,107,90,85,64,12,43,76,86,13,114,1,117,126,0]

b=[18,64,98,5,2,4,6,3,6,48,49,65,32,12,48,65,31,78,62,32,49,32,1,57,96,3,21,9,4,62,3,5,4,1,2,3,44,65,78,32,16,97,54,16,44,52,32,64,89,45,32,65,15,34,18,16,0]

for i in range(57):
    a[i]=a[i]^b[i]
    a[i]=a[i]^19
    print(chr(a[i]),end='')

输出得到zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}

Hello, CTF

打开文件,发现是要输入flag

用IDA打开文件

F5查看伪函数,发现最后有一个strcmp函数,对v10和v13就行比较

    while ( v3 < 17 );
    if ( !strcmp(&v10, &v13) )
      sub_40134B(aSuccess, v7);
    else
      sub_40134B(aWrong, v7);

看前面v13的位置,可以看到先是将字符串437261636b4d654a757374466f7246756e复制到v13的位置

后面对输入进行了判断,输入的字符串不能大于17

    if ( strlen(v9) > 0x11 )
      break;

接着,将字符串以十六进制输出,然后,再将得到的十六进制字符添加到v10

最后,进行比较,看输入的字符串是否和v10的字符串相等,如果相等,则得到flag

所以把437261636b4d654a757374466f7246756e进行十六进制转字符

得到CrackMeJustForFun

dadafaaf