BUUCTF--reverse1,reverse2--WP

文章目录

  • 一.BUUCTF--reverse1
  • 二.BUUCTF--reverse2

一.BUUCTF–reverse1

这道题目也是非常简单,主要考察IDA Pro的使用,分析代码:
发现是64位exe,直接拖到IDA Pro中,发现没有找到主函数:

BUUCTF--reverse1,reverse2--WP_第1张图片

那就直接Shift+F12查找字符串:

2

发现没有直接找到flag,但是我们发现了this is the right flag!\n字段,那就看看它的交叉引用:
BUUCTF--reverse1,reverse2--WP_第2张图片
发现找到了主函数:
BUUCTF--reverse1,reverse2--WP_第3张图片
可以发现这里主要的函数功能在这个循环中实现:
BUUCTF--reverse1,reverse2--WP_第4张图片
那我们直接按F5编译成伪代码:

__int64 sub_1400118C0()
{
  char *v0; // rdi
  __int64 i; // rcx
  size_t v2; // rax
  size_t v3; // rax
  char v5[36]; // [rsp+0h] [rbp-20h] BYREF
  int j; // [rsp+24h] [rbp+4h]
  char Str1[224]; // [rsp+48h] [rbp+28h] BYREF
  unsigned __int64 v8; // [rsp+128h] [rbp+108h]

  v0 = v5;
  for ( i = 82i64; i; --i )
  {
    *(_DWORD *)v0 = -858993460;
    v0 += 4;
  }
  for ( j = 0; ; ++j )
  {
    v8 = j;
    v2 = j_strlen(Str2);
    if ( v8 > v2 )
      break;
    if ( Str2[j] == 111 )
      Str2[j] = 48;
  }
  sub_1400111D1("input the flag:");
  sub_14001128F("%20s", Str1);
  v3 = j_strlen(Str2);
  if ( !strncmp(Str1, Str2, v3) )
    sub_1400111D1("this is the right flag!\n");
  else
    sub_1400111D1("wrong flag\n");
  sub_14001113B(v5, &unk_140019D00);
  return 0i64;
}

注意这是一段伪代码,并非真正的C代码
发现前面第一个for循环是做初始化,在第二个for循环之后,提示用户输入flag,输入之后就与字符串str2作比较了,那么str2就肯定是flag了,我们发现第二个for循环对str2做了处理,我们来分析代码:
我们发现该循环次数为str2的长度,并且发现,如果字符串中有个字符为111(o),那么就将该字符换为0,这里我们不用写脚本了,直接手动换掉,将flag提交:
BUUCTF--reverse1,reverse2--WP_第5张图片
发现没有问题,那么这道题就解出来了
这里给出flag:flag{Hell0_w0rld}

二.BUUCTF–reverse2

这个题目和reverse1可以说是一模一样,只不过是PE文件和ELF文件的区别:
这里给出解题步骤,解题具体过程就不给出了,可以到reverse1WP中看一下,两道题基本一模一样

  • 拖到IDA Pro中,Shift+F12查找字符串,发现 this is the right flag!字段,直接看交叉引用
  • F5编译为反汇编代码
  • 分析代码:

将字符串中‘r’和’i‘换成了1

这里给出flag:flag{hack1ng_fo1_fun}

你可能感兴趣的:(CTF-Reverse,网络安全)