reverse3题解

简介: reverse3题解

reverse3题解


1.查壳

是一个32位可执行文件,没有壳

2.拖入32位IDA静态分析

找到_main_0函数

按下F5反编译

函数稍有点复杂,可以先看看string窗口,看看有没有什么关键的字符串能帮助解题

找到一个标准的base64编码表,说明这个题应该用到了base64加密

base64加密有关内容

Base64编码和Python解码_光无影的博客-CSDN博客

带着这个获取到的信息继续有针对性地查看反编译的代码

sub_41132F("please enter the flag:");
  sub_411375("%20s", &Str);
  v3 = j_strlen(&Str);
  v4 = (const char *)sub_4110BE((int)&Str, v3, (int)&v12);
  strncpy(Dest, v4, 0x28u);

这个输入了flag,获取了长度

sub_4110BE可能就是对输入的Str进行了Base64加密,双击跟进查看

双击跟进sub_411AB0

这一段就是base64加密的特征代码,说明确实是对于这个输入的flag进行了base64加密

使用的应该是我们找到的标准base64编码表

返回主函数继续查看

 v4 = (const char *)sub_4110BE((int)&Str, v3, (int)&v12);
  strncpy(Dest, v4, 0x28u);
  v9 = j_strlen(Dest);
  for ( j = 0; j < v9; ++j )
    Dest[j] += j;
  v5 = j_strlen(Dest);

将加密后的字符串赋值给Dest,进行了一个for循环的操作

if ( !strncmp(Dest, Str2, v5) )
    sub_41132F("rigth flag!\n");
  else
    sub_41132F("wrong flag!\n");

然后将进行了这个操作后的字符串与Str2进行比较,相等就是正确的字符串,说明Str2中存储的就是加密并且for循环操作后的字符串

查看Str2,并且编写逆向脚本,先for循环减去for循环中加的数值,再对得到的字符串解密

双击跟进Str2,得到Str2

'e3nifIH9b_C@n@dH'

3.编写wp

import base64
tmp=""
Str2='e3nifIH9b_C@n@dH'
for i in range(0,len(Str2)):
    tmp+=chr(ord(Str2[i])-i)
flag=base64.b64decode(tmp.encode());
print(flag.decode())


相关文章
|
算法
LeetCode每日1题--反转字符串II
LeetCode每日1题--反转字符串II
75 0
|
算法
LeetCode每日1题--反转字符串
LeetCode每日1题--反转字符串
57 0
|
存储 安全 Unix
reverse2题解
reverse2题解
73 0
reverse2题解
|
存储 安全 C语言
reverse1题解
reverse1题解
70 0
reverse1题解
|
C++
旋转数组STL(reverse)
题目: 给定一个数组,将数组向右移动k步,其中k为非负数。 样例:
69 0