CTF逆向reverse:Reverse sign in

题目Reverse sign in

题目描述

题目中只给了一个rev1文件,其他的没有了。

题目分析

  1. 知道是个逆向题目,所以直接用ida打开该文件,Fn+F5反编译为c伪代码,得到如下图,知道flag就在sub_400686函数中。
  2. 查看sub_400686函数伪代码,如下
  3. 找到byte_400818数据,即为数组中的32个值
  4. (char)(*(_BYTE *)(i + a1)
    在C语言中,内存地址也是用整数int表示(32bit)。因此,(BYTE *)(i+a1) 表示把整数(i+a1)强制转换为BYTE型数值的地址
    • char *(i+a1) 即i+a1指向一个字符串常量
    • ^是在程序中是异或运算符号,即长度为32的数组与i进行异或运算

C++代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
int main()
{
int b[]={0x66,0x6D, 0x63, 0x64, 0x7F, 0x3C, 0x36, 0x72, 0x57, 0x42, 0x64,
0x3B, 0x7B, 0x52, 0x7C, 0x3C, 0x66, 0x54, 0x60,0x60, 0x27,
0x4A, 0x49, 0x7F, 0x71, 0x58, 0x52, 0x72, 0x7D, 0x75, 0x2A, 0x62};
char a[33];
for(int i=0;i<=31;i++)
{
a[i]= b[i]^i;
}
for(int j=0;j<=31;j++)
{
cout<<a[j];
}
cout<<endl;
return 0;
}


得到flag,注意:最后那个是两个_,输入时只输了一个,试了两遍!!!要细心啊~~~

文章目录
  1. 1. 题目Reverse sign in
    1. 1.1. 题目描述
    2. 1.2. 题目分析
    3. 1.3. C++代码