buu-Reverse-[2019红帽杯]childRE

news2024/11/26 8:53:26

目录

[2019红帽杯]childRE

修饰函数名和函数签名是什么?

对于变换部分的具体分析:


[2019红帽杯]childRE

下载附件,查壳,无壳

在IDA中打开,定位主函数

int __cdecl main(int argc, const char **argv, const char **envp)
{
  __int64 len; // rax
  _QWORD *v4; // rax
  const CHAR *v5; // r11
  __int64 v6; // r10
  int v7; // r9d
  const CHAR *v8; // r10
  __int64 v9; // rcx
  __int64 *v10; // rax
  unsigned int i; // ecx
  __int64 j; // r9
  __int128 input[2]; // [rsp+20h] [rbp-38h] BYREF

  memset(input, 0, sizeof(input));
  scanf("%s");
  len = -1i64;
  do
    ++len;
  while ( *(input + len) );
  if ( len != 31 )                              // 输入长度判断
  {
    while ( 1 )
      Sleep(1000u);
  }
  v4 = sub_7FF6EDF11280(input);
  v5 = name;                                    // 待转换的函数名
  if ( v4 )
  {
    sub_7FF6EDF115C0(v4[1]);                    // 变换
    sub_7FF6EDF115C0(*(v6 + 16));
    v7 = chr;
    v5[chr] = *v8;
    chr = v7 + 1;                               // i=i+1
  }
  UnDecorateSymbolName(v5, outputString, 0x100u, 0);// 将修饰后的函数名称转换为函数签名,0是转换符号,表示全转换
  v9 = -1i64;                                   // v5=name=修饰后的函数名称
  do
    ++v9;
  while ( outputString[v9] );
  if ( v9 == 62 )
  {
    i = 0;
    j = 0i64;
    do
    {
      if ( a1234567890Qwer[outputString[j] % 23] != a46200860044218[j] )// 确定outputString%23的余数
        _exit(i);
      if ( a1234567890Qwer[outputString[j] / 23] != a55565653255552[j] )// 确定outputString/23的商
        _exit(i * i);
      ++i;
      ++j;
    }
    while ( i < 62 );
    printf("flag{MD5(your input)}\n");
    return 0;
  }
  else
  {
    v10 = sub_7FF6EDF118A0(std::cout);
    std::ostream::operator<<(v10, sub_7FF6EDF11A60);
    return -1;
  }
}

这一部分是分配内存,输入字符串后再对字符串进行长度判断,要求长度为31

 

 这一部分是对输入字符串的变换,后面具体说明

这一部分中UnDecorateSymbolName()函数是将修饰后的函数名转换为函数签名,v5(也就是name)是修饰后的函数名称 ,outputString是转换成的函数签名,0x100u代表长度,0表示全转换

修饰函数名和函数签名是什么?

20世纪70年代以前,一个函数经过编译器编译后,存储在目标文件内的符号与函数名相同。比如定义一个函数func1,在目标函数中的符号名称也为func1。
但是随着汇编编写库的丰富,定义的函数很有可能与库中的函数名冲突。为了解决这一问题,编译器在将源代码编译成目标文件时,会将函数和变量的名字进行修饰,形成符号名,也就是符号修饰/名字修饰(Decorated Name)函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串,用来指明函数的定义或原型。目的是方便编译过程中,链接器等中间过程识别不同的函数,尤其是在引入重载后,识别函数不能只看函数名,要结合参数、返回值类型来识别。

函数签名包含了一个函数的信息,包括函数名、参数类型、所在类、名称空间及其他信息。
比如:
函数int func(int x)的函数签名为:int func(int)
每个函数签名对应一个修饰后的名字。

 具体怎么修饰:可以参考这几篇文章:

(156条消息) c, c++函数名编译符号修饰符说明_IT超人的博客-CSDN博客

(156条消息) 关于去除PE文件中函数修饰的做法_undecoratesymbolname_clever101的博客-CSDN博客

(156条消息) VS编译器C/C++函数编译后的名字修饰_android编译后函数名_大雄_RE的博客-CSDN博客先有个印象,知道这里有个修饰函数名转函数签名, 往后看,了解程序大致作用后再来了解这部分

这部分就是根据outputString的值做的判断了,第一个if语句可以推断出outputString%23的值,第二个if判断可以推出outputstring/23的值。两者联系可以推出整个outputString的值,上脚本

#include<string.h>
#include<stdlib.h>
int main(){
	char a[]="(_@4620!08!6_0*0442!@186%%0@3=66!!974*3234=&0^3&1@=&0908!6_0*&";
	char b[]="55565653255552225565565555243466334653663544426565555525555222";
	char c[]="1234567890-=!@#$%^&*()_+qwertyuiop[]QWERTYUIOP{}asdfghjkl;ASDFGHJKL:ZXCVBNM<>?zxcvbnm,.";
	int data[100];int cnt,tent;
	int i,j;
	for(i=0;i<62;i++){
		for(j=0;j<100;j++){
			if(c[j]==a[i])
			cnt=j;
			if(c[j]==b[i])
			tent=j;
		}
	printf("%c",tent*23+cnt);	
	}
	
	return 0;
}

 解得:private: char * __thiscall R0Pxx::My_Aut0_PWN(unsigned char *)

不难看出是个函数签名(其实当时看了半天....)好了,现在我们知道了函数签名outputString字符串的值,结合程序的整体思路:将输入的字符串经过变换后,再传给UnDecorateSymbolName()函数做修饰变换,最后得到outputString;现在我们需要知道函数签名对应的修饰函数,v5即name的值。根据上面推荐的文章进行转换:

 name=?My_Aut0_PWN

 name=?My_Aut0_PWN@R0Pxx

  name=?My_Aut0_PWN@R0Pxx@@AAE

 函数的返回值是chaar*类型即PAD

函数的参数是unsigned char*类型即PAE

name=?My_Aut0_PWN@R0Pxx@@AAEPADPAE

name=?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z

现在,得到了修饰函数的值,再往前推,看这部分怎样进行加密的

动态调试

尽量输入有顺序的31位数,方便观察怎样变换的,F7进入函数查看具体变换,得到如下顺序

 对应下标变换就是

15,7,17,18,8,3,19,20,9,21,22,10,4,1,23,24,11,25,26,12,5,27,28,13,29,30,14,6,2,0

 逆向解出输入的值

#include<stdio.h>
#include<string.h>
int main(){
	char a[]="?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z";
	int b[31]={15,16,7,17,18,8,3,19,20,9,21,22,10,4,1,23,24,11,25,26,12,5,27,28,13,29,30,14,6,2,0};
	int i,j,cnt=0;
	char c[31];
for(i=0;i<strlen(a);i++){
		c[b[cnt]]=a[i];
		cnt++;
}
for(i=0;i<strlen(a);i++)
printf("%c",c[i]);
	return 0;
}

得到值:Z0@tRAEyuP@xAAA?M_A0_WNPx@@EPDP  再进行MD5加密就可以得到flag啦

对于变换部分的具体分析:

这个部分应该是二叉树,

是进行了建树操作

 

这部分是后序遍历,即变换操作 ,这样得到最后的序列

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

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

相关文章

深度学习笔记之Transformer(八)Transformer模型架构基本介绍

机器学习笔记之Transformer——Transformer模型架构基本介绍 引言回顾&#xff1a;简单理解&#xff1a; Seq2seq \text{Seq2seq} Seq2seq模型架构与自编码器自注意力机制 Transformer \text{Transformer} Transformer架构关于架构的简单认识多头注意力机制包含掩码的多头注意力…

kubernetes 1.27.3 集群部署方案

一、准备环境 1.1 Kubernetes 1.27.3 版本集群部署环境准备 1.1.1 主机硬件配置说明 cpu内存硬盘角色主机名系统版本 8C 8G 1024GB master master01 centos 7.9 8C 16G 1024GB worker(node) worker01 centos 7.9 8C 16G 1024GB worker(node) worker…

EasyCVR平台Ehome协议接入,设备管理中出现新增通道按钮的问题优化

EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。 有用…

软件测试重要性

导言&#xff1a; 在现代软件开发中&#xff0c;软件测试扮演着确保质量的重要角色。通过对软件系统的验证和验证&#xff0c;软件测试有助于发现潜在的缺陷和问题&#xff0c;并确保软件在部署之前能够达到预期的质量标准。本文将深入探讨软件测试的重要性、测试的类型以及成功…

docker常用功能以及mysql实际使用【推荐】

docker常用功能以及mysql实际使用&#xff1a; 一、docker常用命令&#xff1a; 查看版本 docker -v [rootlocalhost ~]# docker -v Docker version 23.0.4, build f480fb1 [rootlocalhost ~]# 2. 查看 Docker 中已存在的镜像 docker images [rootlocalhost ~]# docker ima…

从零开始制作一个Web蜜罐扫描器(3)

从零开始制作一个Web蜜罐扫描器(2)_luozhonghua2000的博客-CSDN博客 那么经过字典的优化,最终就得到了一份ok的字典,如下所示 基本上都是有效的api,那么字典清洗这一步到这里就算完成了。 有了一份好的字典,准确性的问题就迎刃而解。 。 怎么快速且准确且批量的找到蜜储 这…

jenkins实现easyswoole 持续集成/持续部署

jenkins环境jenkins需要使用root用户启动可通过修改 vim /etc/sysconfig/jenkins改为root,也可直接命令行root启动新增流水线项目安装远程构建插件Generic Webhook Trigger勾选触发远程构建保存之后,访问 /generic-webhook-trigger/invoke?tokeneasyswoole-test,即可自动bui…

IDEA中 application.yaml文件没有绿色的叶子

IDEA中 application.yaml文件没有绿色的叶子 问题背景 前段时间一直在刷算法题和备战考试&#xff0c;忽略了项目方面的锻炼&#xff0c;于是今天就想着来写一个练手的项目&#xff0c;重新熟悉一下技术栈。结果刚搭建一个SpringBoot项目&#xff0c;就发现application.yaml配…

支付宝接入

支付宝接入 python-alipay-sdk pycryptodome一、电脑网站支付 1.1 获取支付宝密钥 沙箱网址 1.APPID 2.应用私钥 3.支付宝公钥1.2 存放密钥 在与 settings.py 的同级目录下创建 pem 文件夹pem 文件夹下创建 app_private_key.pem 和 alipay_public_key.pem app_private_key…

分类模型评估指标详解(二分类、多分类、混淆矩阵)

一 、二分类评估 1.混淆矩阵 (ConfusionMatrix) TP&#xff1a;1的预测为1 (正确的积极) 正确判断 FP&#xff1a;0预测为1 (错误的积极) 错误判断 FN&#xff1a;1预测为0 (正确的消极) 漏判断的 TN&#xff1a;0预测为0 (错误的消极) 成功未判断的 准确率&#xff1a;(a…

Unity使用UGUI划线

Unity 里面虽然提供Linerender绘制线条&#xff0c;但是只能在3D空间划线&#xff0c;有时候需要在UI上绘制指定的线条&#xff0c;柱状图&#xff0c;饼状图等就可以采用下面的方式了。 创建DrawLine&#xff0c;继承MaskableGraphic类&#xff0c;重写OnPopulateMesh(VertexH…

【VirtualBox】win10安装配置 Vbox---超详细 最新 持续更新中

概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径&#xff0c;学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、开发环境 VirtualBox 官网开发环境&#xff1a;windows10VirtualBox&#xff1a;VirtualBox7.0…

超级应用App的建设路径:业务功能小程序化

过往硅谷巨头对于「微信」这样的「超级应用」不屑一顾&#xff0c;如今Super App似乎已经成为巨头间的一个新共识&#xff0c;Meta、Snap、Uber等公司逐步将更多功能塞进现有App。 Facebook 做起了约会、招聘&#xff1b;Snap 则实打实学起了微信的「平台战略」&#xff0c;开始…

Java虚拟机(JVM)介绍

JVM是什么 JVM是Java Virtual Machine的缩写。它是一种基于计算设备的规范&#xff0c;是一台虚拟机&#xff0c;即虚构的计算机。 JVM屏蔽了具体操作系统平台的信息&#xff08;显然&#xff0c;就像是我们在电脑上开了个虚拟机一样&#xff09;&#xff0c;当然&#xff0c;J…

js (一)数据类型与判断

数据类型 基本&#xff08;值&#xff09;类型&#xff1a; String 字符串是不可变的 let lang“java”; lang lang “script”; //先销毁再创建 Number 在数值类型中&#xff0c;存在一个特殊数值NaN&#xff0c;意为“不是数值”&#xff0c;用于表示本来要返回数值的…

计算机网络——计算机网络体系结构

文章目录 **1 计算机网络概述****1.1 概念****1.2 组成****1.3 功能****1.4 分类****1.5 性能指标** **2 计算机网络体系结构与参考模型****2.1 计算机网络分层结构****2.2 计算机网络协议&#xff0c;接口&#xff0c;服务的概念****2.3 ISO/OSI参考模型和TCP/IP模型** 1 计算…

操作系统Linux-day02

Linux学习 常见的cmd命令 winR 输入cmd打开窗口 ipconfig 查看ip地址信息ping查看网络连接情况或者网速情况 ping内网&#xff0c;外网&#xff0c;路由cd change directory 切换目录 cd 目录名称 切换到目录下 cd .. 切换到上一级 cd / 切换到根目录 dir 显示目录中的文…

Oracle初级

目录 概念 数据库分类 Oracle 存储结构 安装成功 ​编辑 创建用户和表空间 以超级管理员身份登录 创建表空间 创建用户 给用户授权 查询测试 概念 数据库&#xff08;database&#xff09;: 物理操作系统文件或磁盘的集合。简单来说数据库的意思是数据的集合。 DBM…

基于51单片机的智能照明控制系统

**功能&#xff1a;**基于51单片机的智能照明控制系统&#xff0c;以51系列单片机为核心&#xff0c;使用光敏传感模块(采用ADC0832对光敏电路进行AD转换)、红外传感模块与声敏传感模块组成检测装置&#xff0c;并采用PWM对照明灯的光强度进行控制。 1.本设计分为手动模式和自动…

Python入门自学进阶-Web框架——37、异步IO与scrapy

异步IO&#xff1a; 一个请求多个网址并获取返回值的程序&#xff1a; import requestsurl_list [https://www.baidu.com,https://www.google.com,https://www.bing.com,https://www.sohu.com, ] for url in url_list:print(开始请求&#xff1a;,url)response requests.ge…