re学习(25)i春秋-re-basebasebase(base64+函数构造)

news2025/1/12 12:28:22

参考文章:re学习笔记(22)爱春秋CTF答题夺旗赛(第四季)-re-basebasebase_ctfbase~base_Forgo7ten的博客-CSDN博

总结:1.flag——→base64加密(自定义)——→与3异或——→加密后数据(对比,相等成功)

          2.关键代码?构造函数(P键)?

3.为什么要进行栈指针的调整?那个快捷键进行栈指针调整?如何打开栈指针?

Alt+K键(调整栈指针)

4.base64解密

       自定义base64编码表   

       转义字符串

       加密解密字符串的长度关系

题解:
构造函数后发现的函数:
 

int __usercall sub_40103B@<eax>(int a1@<ebp>)
{
  *(_DWORD *)(a1 - 132) = 0;
  *(_BYTE *)(a1 - 40) = 89;
  *(_BYTE *)(a1 - 39) = 110;
  *(_BYTE *)(a1 - 38) = 123;
  *(_BYTE *)(a1 - 37) = 107;
  *(_BYTE *)(a1 - 36) = 89;
  *(_BYTE *)(a1 - 35) = 32;
  *(_BYTE *)(a1 - 34) = 119;
  *(_BYTE *)(a1 - 33) = 106;
  *(_BYTE *)(a1 - 32) = 90;
  *(_BYTE *)(a1 - 31) = 91;
  *(_BYTE *)(a1 - 30) = 77;
  *(_BYTE *)(a1 - 29) = 111;
  *(_BYTE *)(a1 - 28) = 91;
  *(_BYTE *)(a1 - 27) = 67;
  *(_BYTE *)(a1 - 26) = 90;
  *(_BYTE *)(a1 - 25) = 42;
  *(_BYTE *)(a1 - 24) = 90;
  *(_BYTE *)(a1 - 23) = 67;
  *(_BYTE *)(a1 - 22) = 119;
  *(_BYTE *)(a1 - 21) = 101;
  *(_BYTE *)(a1 - 20) = 86;
  *(_BYTE *)(a1 - 19) = 110;
  *(_BYTE *)(a1 - 18) = 85;
  *(_BYTE *)(a1 - 17) = 67;
  *(_BYTE *)(a1 - 16) = 89;
  *(_BYTE *)(a1 - 15) = 91;
  *(_BYTE *)(a1 - 14) = 73;
  *(_BYTE *)(a1 - 13) = 121;
  *(_BYTE *)(a1 - 12) = 89;
  *(_BYTE *)(a1 - 11) = 91;
  *(_BYTE *)(a1 - 10) = 42;
  *(_BYTE *)(a1 - 9) = 41;
  *(_BYTE *)(a1 - 8) = 3;
  printf("Give Me Flag:");
  *(_BYTE *)(a1 - 76) = 0;
  *(_DWORD *)(a1 - 75) = 0;
  *(_DWORD *)(a1 - 71) = 0;
  *(_DWORD *)(a1 - 67) = 0;
  *(_DWORD *)(a1 - 63) = 0;
  *(_DWORD *)(a1 - 59) = 0;
  *(_DWORD *)(a1 - 55) = 0;
  *(_DWORD *)(a1 - 51) = 0;
  *(_DWORD *)(a1 - 47) = 0;
  scanf("%s", a1 - 76);                         // a1-76为用户的输入
  *(_DWORD *)(a1 - 128) = a1 - 76;              // a1-128  是一个指针,指向用户输入
  *(_DWORD *)(a1 - 144) = *(_DWORD *)(a1 - 128) + 1;// a1-144存储用户输入第二个字符
  do
    *(_BYTE *)(a1 - 113) = *(_BYTE *)(*(_DWORD *)(a1 - 128))++;
  while ( *(_BYTE *)(a1 - 113) );
  *(_DWORD *)(a1 - 140) = *(_DWORD *)(a1 - 128) - *(_DWORD *)(a1 - 144);
  *(_DWORD *)(a1 - 148) = base64((char *)(a1 - 76), *(_DWORD *)(a1 - 140), (int *)(a1 - 136));// a1-140  为编码之前的长度
                                                // a1-136  为base64编码后的长度
  for ( *(_DWORD *)(a1 - 124) = 0; *(int *)(a1 - 124) < 33; ++*(_DWORD *)(a1 - 124) )// a1-124 为计数器   <33   33位
    *(_BYTE *)(a1 + *(_DWORD *)(a1 - 124) - 112) = *(_BYTE *)(*(_DWORD *)(a1 - 124) + *(_DWORD *)(a1 - 148)) ^ 3;// base64编码后与3异或
                                                //  赋给a1-112
  for ( *(_DWORD *)(a1 - 120) = 0; *(_DWORD *)(a1 - 120) < *(_DWORD *)(a1 - 136); ++*(_DWORD *)(a1 - 120) )
  {                                             // a1-120为计数器,循环次数为base64编码后的长度
    if ( *(char *)(a1 + *(_DWORD *)(a1 - 120) - 112) != *(char *)(a1 + *(_DWORD *)(a1 - 120) - 40) )// a1-40上面有数据
    {                                           // base64编码后,再与3异或,然后与a1-40比较
      printf(&byte_40302C);
      exit(0);
    }
    ++*(_DWORD *)(a1 - 132);                    // 如果不相等,a1-132就不加,不加的话,下面判断就会失败
  }
  if ( *(_DWORD *)(a1 - 132) == *(_DWORD *)(a1 - 136) )
    printf("Successful!\n");
  return 0;
}

全程指针操作

上解密脚本:
 

import base64
text = [89,110,123,107,89,32,119,106,90,91,77,111,91,67,90,42,90,67,119,101,86,110,85,67,89,91,73,121,89,91,42,41,3]
for i in range(len(text)):
    text[i] ^= 3
    text[i] = chr(text[i])
text = ''.join(text)
text += "==="
print(base64.b64decode(text.translate(str.maketrans("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz)!@#$%^&*(+/","ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")).encode('utf-8')))
#b'flag{base_f4ck_Reverse}<' 在Python中,前缀"b"表示一个字节字符串(bytes)
#当您使用base64.b64decode()函数解码Base64编码的数据时,返回的结果是字节字符串。
# 字节字符串是由原始字节组成的,每个字节对应一个ASCII字符或二进制数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/794937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring启动流程 (6完结) springmvc启动流程

SpringMVC的启动入口在SpringServletContainerInitializer类&#xff0c;它是ServletContainerInitializer实现类(Servlet3.0新特性)。在实现方法中使用WebApplicationInitializer创建ApplicationContext、创建注册DispatcherServlet、初始化ApplicationContext等。 SpringMVC…

大数据Flink(五十):流式计算简介

文章目录 流式计算简介 一、数据的时效性 二、流式计算和批量计算

dubbo概论

目录 前言&#xff1a; 1.概述 2.服务发现 3.容错 3.1.注册中心宕机 3.2.负载均衡 3.3.限流、熔断 4.通信协议 4.1.HTTP 4.2.dubbo 5.总结 前言&#xff1a; 这可能是全网最深入浅出的dubbo文章&#xff0c;如果你会spring cloud&#xff0c;恭喜你&#xff0c;你可…

Zookeeper命令总结

目录 1、常用命令2、ls path3、create xxx创建持久化节点创建临时节点创建持久化序列节点 4、get path5、set path6、delete path7、监听器总结1&#xff09;节点的值变化监听2&#xff09;节点的子节点变化监听&#xff08;路径变化&#xff09;3&#xff09;当某个节点创建或…

Maven基础之项目创建、packaging

文章目录 创建 maven 项目流程骨架是浮云&#xff0c;packaging 是关键 创建 maven 项目流程 通过骨架&#xff08;archetype&#xff09;创建 maven 工程 第一步&#xff1a;选择 new → maven → Maven Project 第二步&#xff1a;New Maven Project 窗口不作任何设置&…

【软件测试】基于博客系统的自动化测试

目录 1.我的博客系统链接 2.使用selenium对博客系统进行自动化测试 1.引入依赖 2.创建公共类 3.创建测试套件类 4.测试登陆界面 5. 测试博客列表页 6.测试写博客页面 7.测试删除博客 8.最终运行结果 1.我的博客系统链接 用户登录 2.使用selenium对博客系统进行自动…

网络安全(黑客)系统自学,成为一名白帽黑客

前言 黑客技能是一项非常复杂和专业的技能&#xff0c;需要广泛的计算机知识和网络安全知识。你可以参考下面一些学习步骤&#xff0c;系统自学网络安全。 在学习之前&#xff0c;要给自己定一个目标或者思考一下要达到一个什么样的水平&#xff0c;是学完找工作&#xff08;…

学习笔记22 map

一、概论 map的每个元素都由两个部分组成&#xff1a;键和值。每个键都与一个特定的值相关联&#xff0c;并且可以用于定位该值。 map和set很像&#xff0c;只不过map存储的是key&#xff0c;由key再映射到value&#xff0c;而set存储的就是value本身。 Map接口是泛型的&…

拦截Bean使用之前各个时机的Spring组件

拦截Bean使用之前各个时机的Spring组件 之前使用过的BeanPostProcessor就是在Bean实例化之后&#xff0c;注入属性值之前的时机。 Spring Bean的生命周期本次演示的是在Bean实例化之前的时机&#xff0c;使用BeanFactoryPostProcessor进行验证&#xff0c;以及在加载Bean之前进…

flink to starrocks 问题集锦....

[问题排查]导入失败相关 - 问题排查 - StarRocks中文社区论坛 starrocks官网如下&#xff1a; Search StarRocks Docs starrocks内存配置项&#xff1a; 管理内存 Memory_management StarRocks Docs 问题1&#xff1a;实时写入starrocks &#xff0c;配置参数设置如下&a…

【【51单片机11.0592晶振红外遥控】】

51单片机11.0592晶振红外遥控 红外遥控&#xff0c;51单片机完结 这是初步实现的架构 怎么实现内部的详细逻辑 我们用状态机的方法 0状态时一个空闲状态 当它接收到下降沿开始计时然后转为1状态 1状态下 寻找start 或者repeat的信号 再来下降沿读出定时器的值 如果是start 那…

华为eNSP:isis的配置

一、拓扑图 二、路由器的配置 配置接口IP AR1&#xff1a; <Huawei>system-view [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei-GigabitEthernet0/0/0]qu AR2: <Huawei>system-view [Huawei]int g0/0/0 [Huawei-GigabitEthe…

【沁恒蓝牙mesh】数据收发接口与应用层模型传递

本文主要描述了沁恒蓝牙mesh SDK的蓝牙数据收发接口&#xff0c;以及应用层的回调函数解析以及模型传递 这里写目录标题 1. 数据收发接口1.1【发送数据】1.2 【数据接收】 2. 应用层模型分析 1. 数据收发接口 1.1【发送数据】 /*&#xff08;1&#xff09;接口1 */ /*接口一&…

力扣热门100题之最大子数组和【中等】【动态规划】

题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&a…

Java文字转语音功能实现

需要下载jacob-1.18&#xff0c;网上一堆 项目中引入pom文件 <!-- https://mvnrepository.com/artifact/com.jacob/jacob 文字转语音 --> <dependency><groupId>com.hynnet</groupId><artifactId>jacob</artifactId><version>1.18&…

Go语言中‘String’包中的‘Cut‘函数的实现

Go语言中‘String’包中的’Cut’函数的实现 ​ Cut函数用于在字符串**‘s’中查找子串’sep’&#xff0c;并将字符串’s’在子串 ‘sep’ 第一次出现的位置分割成两部分&#xff1a;before和after** package main import("fmt" "strings" ) func main(…

Python初学

认识计算机&#xff1a; 计算机是怎么构成的——冯诺依曼体系结构 内存外存的区别&#xff1a; 一般机械硬盘的存储数据的期限是&#xff1a;几年到十几年 什么是编程&#xff1f; 制作软件——编程/软件开发 编程语言有哪些&#xff1f; Python Python背景知识 荷兰人Guid…

M5ATOMS3基础02传感器MPU6886

M5ATOMS3基础01按键 简洁版本 MPU6886是一款6轴IMU单元&#xff0c;具有3轴重力加速度计和3轴陀螺仪。它采用16位ADC&#xff0c;内置可编程数字滤波器和片上温度传感器&#xff0c;并通过I2C接口&#xff08;地址为0x68&#xff09;与上位机通信。MPU6886支持低功耗模式&#…

Linux系统MySQL中用户的权限管理

本节主要学习用户权限管理的概述&#xff0c;用户权限类型&#xff0c;用户赋权&#xff0c;权限删除&#xff0c;用户删除等。 目录 一、概述 二、用户权限类型 三、用户赋权 四、权限删除 五、用户删除 一、概述 数据库用户权限管理是数据库系统中非常重要的一个方面&am…

如何理解 SpringBoot 的生命周期

生命周期&#xff0c;就是从诞生到死亡的一个过程。Spring 中 bean 也是如此。在 Spring 中的 ConfigurableApplicationContext 的 refresh 开始直到一个 bean 可以被正常使用&#xff0c;中间经历了一系列初始化操作&#xff1b;而在其 close 后又经历了一系列销毁操作&#x…