buu simplerev_BUU_RE题目WP(一)

刚入RE,话不多说,BUU部分RE题目WP如下:

1.easyre

40701390d8c8a003af8a351d6f34aecd.png

cmd打开,输入,发现输出错误,拖入IDA查看

e7f9c06cb5adb4cf2ba5afec7d0e11d8.png

其实直接看到flag,但还是具体来分析一下

首先输入两个输入两个int类型的数,然后比较,如果不相等,则跳转到loc_40152F,并输出sorry,youcan't get flag;如果相等,则继续执行,输出flag。

反汇编代码如下:

c3bb573ea48ba1d8ffc9f06b51db664e.png

与之前分析的还是如出一辙。

2.reverse1

下载EXE,cmd打开,输入后发现输出wrong

47884aee6744b98316c623dd30461e6f.png

拖入IDA打开后发现找不到入口,查找字符串发现有类似flag的东西,之后一个个函数查看,发现sub_140011bC0出有异样

bcaf455c8521b5ac95a4be9164202920.png

关键代码第二个for循环处,大致含义是将str2字符串的字母o改为数字零(111和48的ASCII码分别为o和0,IDA中按R即可转换)

str2为:

65b21bf026376ee526fbc5131ecf3d8f.png

输入flag,正确:

09d6fd9cc727abdb4fdbd006f6c825fa.png

3.reverse2

下载打开后发现无后缀名,拖入winhex查看:

e2eb8a98ccf906fd617f12ebad27902d.png

是Linux下可执行文件,执行查看:

2416af14fedcf91c4803e46f67889cb5.png

拖入IDA查看

57adea401d2da69e618a742284d2d3f8.png

大致含义即为将i和r替换成为1,输入,得到flag。

6616b9d165bc516da9fea4e5333f8129.png

4.内涵的软件

下载文件,cmd打开

d6becf1bd3795cd908ab7c03230c8fea.png

拖入IDA查看

c951597138a3d1750a6a5bcf03a93109.png

直接可以看到flag,但还是分析一波

10e4e87e2722dcbcbc1a966497cefbc9.png

额。。好像和v2没啥关系。。flag对就完事了

5.新年快乐

下载EXE后运行

0ec1d45ab1a85131ef7f93dc9af72eed.png

拖入IDA发现有壳,peid查壳

abd947a293ee07c47d171f9128080aeb.png

upx -d 脱壳

// 刚学PE没多久,upx壳的话。。先往后稍稍,这个是网上查的。

621cf758a2018cfa57778a407a589873.png

拖入ida

320472c83787873dd40ad9fd728c05f4.png

得到flag

c95ab7170e904175c919c3b5bd03d593.png

6.[BJDCTF2nd]guessgame

343ebb90ee0ca71af389fc5f38764c84.png

shift+F12直接看到flag。。。

7.helloworld

没学过apk逆向,网上翻了下其他的wp,apkkiller打开

字符串中看到flag:

55325bee35efb7ea34f8829cf216c2ca.png

8.XOR

拖入IDA

fb89dd9ab4b7d8cde761209b10c18e34.png

global:

0e08839f016607327701a8d669d2d469.png

shift+e提取:

b623ea45f3d199e878e912b8adea8fa6.png

代码如下:

320472c83787873dd40ad9fd728c05f4.png

第一次自己写,不会py,所以用c写的,也就那样,凑合着看吧...

9.reserve3

下载打开

cbb703566e13e85e421dba417ca89165.png

丢进IDA

d809becc00292327aa5be051184af4a5.png

经过一个sub_4110BE函数,然后for循环,之后再与str2比较,str2如下:

176f03242cec8d0e051891add105e1f4.png

跟进sub_4110BE:

void *__cdecl sub_411AB0(char *a1, unsigned int a2, int *a3){  int v4; // STE0_4  int v5; // STE0_4  int v6; // STE0_4  int v7; // [esp+D4h] [ebp-38h]  signed int i; // [esp+E0h] [ebp-2Ch]  unsigned int v9; // [esp+ECh] [ebp-20h]  int v10; // [esp+ECh] [ebp-20h]  signed int v11; // [esp+ECh] [ebp-20h]  void *Dst; // [esp+F8h] [ebp-14h]  char *v13; // [esp+104h] [ebp-8h]  if ( !a1 || !a2 )    return 0;  v9 = a2 / 3;  if ( (signed int)(a2 / 3) % 3 )    ++v9;  v10 = 4 * v9;  *a3 = v10;  Dst = malloc(v10 + 1);  if ( !Dst )    return 0;  j_memset(Dst, 0, v10 + 1);  v13 = a1;  v11 = a2;  v7 = 0;  while ( v11 > 0 )  {    byte_41A144[2] = 0;    byte_41A144[1] = 0;    byte_41A144[0] = 0;    for ( i = 0; i < 3 && v11 >= 1; ++i )    {      byte_41A144[i] = *v13;      --v11;      ++v13;    }    if ( !i )      break;    switch ( i )    {      case 1:        *((_BYTE *)Dst + v7) = aAbcdefghijklmn[(signed int)(unsigned __int8)byte_41A144[0] >> 2];        v4 = v7 + 1;        *((_BYTE *)Dst + v4++) = aAbcdefghijklmn[((byte_41A144[1] & 0xF0) >> 4) | 16 * (byte_41A144[0] & 3)];        *((_BYTE *)Dst + v4++) = aAbcdefghijklmn[64];        *((_BYTE *)Dst + v4) = aAbcdefghijklmn[64];        v7 = v4 + 1;        break;      case 2:        *((_BYTE *)Dst + v7) = aAbcdefghijklmn[(signed int)(unsigned __int8)byte_41A144[0] >> 2];        v5 = v7 + 1;        *((_BYTE *)Dst + v5++) = aAbcdefghijklmn[((byte_41A144[1] & 0xF0) >> 4) | 16 * (byte_41A144[0] & 3)];        *((_BYTE *)Dst + v5++) = aAbcdefghijklmn[((byte_41A144[2] & 0xC0) >> 6) | 4 * (byte_41A144[1] & 0xF)];        *((_BYTE *)Dst + v5) = aAbcdefghijklmn[64];        v7 = v5 + 1;        break;      case 3:        *((_BYTE *)Dst + v7) = aAbcdefghijklmn[(signed int)(unsigned __int8)byte_41A144[0] >> 2];        v6 = v7 + 1;        *((_BYTE *)Dst + v6++) = aAbcdefghijklmn[((byte_41A144[1] & 0xF0) >> 4) | 16 * (byte_41A144[0] & 3)];        *((_BYTE *)Dst + v6++) = aAbcdefghijklmn[((byte_41A144[2] & 0xC0) >> 6) | 4 * (byte_41A144[1] & 0xF)];        *((_BYTE *)Dst + v6) = aAbcdefghijklmn[byte_41A144[2] & 0x3F];        v7 = v6 + 1;        break;    }  }  *((_BYTE *)Dst + v7) = 0;  return Dst;}

感觉挺像base64,而且

cda3ce3f7d57ab334ce41c7912ebd3c0.png

那应该是就是了,恰巧之前了解过base64,具体如下:

180c341be010945120104e5913bba0fc.png

不会py,还是c

9a89cf1a2ed7c3d76094e0b1731e6c5c.png

,之后base64 解密得到flag

10.不一样的flag

下载打开:

d2e280cb33fdea44401cab14bd1efac6.png

int __cdecl main(int argc, const char **argv, const char **envp){  char v3; // [esp+17h] [ebp-35h]  int v4; // [esp+30h] [ebp-1Ch]  int v5; // [esp+34h] [ebp-18h]  signed int v6; // [esp+38h] [ebp-14h]  int i; // [esp+3Ch] [ebp-10h]  int v8; // [esp+40h] [ebp-Ch]  __main();  v4 = 0;  v5 = 0;  qmemcpy(&v3, _data_start__, 0x19u);  while ( 1 )  {    puts("you can choose one action to execute");    puts("1 up");    puts("2 down");    puts("3 left");    printf("4 right\n:");    scanf("%d", &v6);    if ( v6 == 2 )    {      ++v4;    }    else if ( v6 > 2 )    {      if ( v6 == 3 )      {        --v5;      }      else      {        if ( v6 != 4 )LABEL_13:          exit(1);        ++v5;      }    }    else    {      if ( v6 != 1 )        goto LABEL_13;      --v4;    }    for ( i = 0; i <= 1; ++i )    {      if ( *(&v4 + i) < 0 || *(&v4 + i) > 4 )        exit(1);    }    if ( *(&v8 + 5 * v4 + v5 - 41) == '1' )      exit(1);    if ( *(&v8 + 5 * v4 + v5 - 41) == '#' )    {      puts("\nok, the order you enter is the flag!");      exit(0);    }  }}

8a47c90cde8026c2455a4e4bc0fa1918.png

之前做过一道走迷宫的题,感觉挺像,而且:

bc4dc179e0c89cb084d0fb552cf2c924.png

只要是1就退出,是#就puts()

  *1111  01000  01010  00010  1111#

就是走迷宫,得到flag.

11.SimpleRev

拖入ida看,

int __cdecl __noreturn main(int argc, const char **argv, const char **envp)                         {                                                                                                     int v3; // eax                                                                                      char v4; // [rsp+Fh] [rbp-1h]                                                                                                                                                                           while ( 1 )                                                                                         {                                                                                                     while ( 1 )                                                                                         {                                                                                                     printf("Welcome to CTF game!\nPlease input d/D to start or input q/Q to quit this program: ", argv, envp);      v4 = getchar();                                                                                     if ( v4 != 100 && v4 != 68 )                                                                          break;                                                                                            Decry();                                                                                          }                                                                                                   if ( v4 == 113 || v4 == 81 )                                                                          Exit();                                                                                           puts("Input fault format!");                                                                        v3 = getchar();                                                                                     putchar(v3);                                                                                      }                                                                                                 }关键代码是Decry()unsigned __int64 Decry(){  char v1; // [rsp+Fh] [rbp-51h]  int v2; // [rsp+10h] [rbp-50h]  int v3; // [rsp+14h] [rbp-4Ch]  int i; // [rsp+18h] [rbp-48h]  int v5; // [rsp+1Ch] [rbp-44h]  char src[8]; // [rsp+20h] [rbp-40h]  __int64 v7; // [rsp+28h] [rbp-38h]  int v8; // [rsp+30h] [rbp-30h]  __int64 v9; // [rsp+40h] [rbp-20h]  __int64 v10; // [rsp+48h] [rbp-18h]  int v11; // [rsp+50h] [rbp-10h]  unsigned __int64 v12; // [rsp+58h] [rbp-8h]  v12 = __readfsqword('(');  *(_QWORD *)src = 'SLCDN';  v7 = 0LL;  v8 = 0;  v9 = 'wodah';  v10 = 0LL;  v11 = 0;  text = join(key3, (const char *)&v9);         // text = killshadow  strcpy(key, key1);  strcat(key, src);                             // key = ADSFKNDCLS  v2 = 0;  v3 = 0;  getchar();  v5 = strlen(key);                             // v5长度 10  for ( i = 0; i < v5; ++i )  {    if ( key[v3 % v5] > 64 && key[v3 % v5] <= 90 )//大小写转换      key[i] = key[v3 % v5] + 32;               // key = adsfkndcls    ++v3;  }  printf("Please input your flag:", src);  while ( 1 )  {    v1 = getchar();    if ( v1 == '\n' )      break;    if ( v1 == ' ' )                            //如果getchar为空格,v2加1    {      ++v2;    }    else    {      if ( v1 <= '`' || v1 > 'z' )              // 如果v1不是小写字母      {        if ( v1 > '@' && v1 <= 'Z' )            // 如果v1为大写字母          str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;// 处理str2[v2],转换为小写字母      }      else                                      // 如果是小写字母      {        str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;      }      if ( !(v3 % v5) )        putchar(' ');      ++v2;    }  }  if ( !strcmp(text, str2) )                    // 如果两个值相同,则congratulation    puts("Congratulation!\n");  else    puts("Try again!\n");  return __readfsqword(40u) ^ v12;}

其中的join():

0cce39108f72993f986243cdd6d0032e.png

代码:

38913c18822cfd64b2858842f9aee986.png

这个代码我这个菜狗写了半天,再看看人家py的代码短的一批,py要赶紧学了....

12.Java逆向解密

不太会Java,看了看网上WP说是要jd-gui的一个软件,打开:

ab019eb44eb4b31e53ceeee1a326381f.png

Java不太会,差不多就是逐个将输入的字符加上@的ascii码再异或32,然后和KEY比较,

62f341d5bf11af1aa18bb2c8c6aa0ef3.png

目前就先干这么多吧,赶紧先把py学一学,用c写脚本太鸡肋...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值