buu-Reverse-[2019红帽杯]childRE

目录

[2019红帽杯]childRE

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

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


[2019红帽杯]childRE

下载附件,查壳,无壳

在IDA中打开,定位主函数

int __cdecl main(int argc, const char **argv, const char **envp)
{__int64 len; // rax_QWORD *v4; // raxconst CHAR *v5; // r11__int64 v6; // r10int v7; // r9dconst CHAR *v8; // r10__int64 v9; // rcx__int64 *v10; // raxunsigned int i; // ecx__int64 j; // r9__int128 input[2]; // [rsp+20h] [rbp-38h] BYREFmemset(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.hqwc.cn/news/19444.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kotlin~责任链模式

概念 允许多个对象按顺序处理请求或任务。 角色介绍 Handler: 处理器接口,提供设置后继者&#xff08;可选&#xff09;ConcreteHandler&#xff1a;具体处理器&#xff0c;处理请求 UML 代码实现 比如ATM机吐钱就可以使用责任链实现。 class PartialFunction<in P1, o…

POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 列式数据是如何存储与处理的

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

无聊猿惨遭亏本甩卖 “贵族”持有人沦为“大冤种

被称为NFT贵族的无聊猿&#xff08;BAYC&#xff09;正在进行挥泪大甩卖&#xff0c;歌手黄立成等持有者们近期不断抛售BAYC NFT&#xff0c;导致该系列NFT地板价一度跌至30 ETH&#xff08;约5.7万美元&#xff09;以下。 一年多以前&#xff0c;BAYC还是时尚界的宠儿&#x…

JavaCV实现byte[]转RTMP流

需求&#xff1a;通过私有的api我可以不断收到byte[]形式的视频数据&#xff0c;现在我需要处理这些数据&#xff0c;最终推送出RTMP流。 实现&#xff1a;通过管道流将不断收到的byte[]视频数据转化为输入流然后提供给JavaCV的FFmpegFrameGrabber使用&#xff0c;然后通过FFmp…

96、基于STM32单片机的温湿度DHT11 烟雾火灾报警器蓝牙物联网APP远程控制设计(程序+原理图+任务书+参考论文+开题报告+流程图+元器件清单等)

单片机及温湿度、烟雾传感器是烟雾报警器系统的两大核心。单片机好比一个桥梁&#xff0c;联系着传感器和报警电路设备。近几年来&#xff0c;单片机已逐步深入应用到工农业生产各部门及人们生活的各个方面。各种类型的单片机也根据社会的需求而开发出来。单片机是器件级计算机…

机器人xacro文件转换成urdf文件方法,并在rviz可视化

一、进入工作空间&#xff0c;source一下 cd cat_ws source devel/setup.bash二、进入xacro所在的文件夹&#xff0c;完成xacro文件到urdf文件的转换 cd src/kinova-ros/kinova_description/urdf/然后执行下面命令 rosrun xacro xacro.py two_arm_robot_example_standalone.…

华为路由器如何通过Console口进行基本配置

华为HCIA试听课程&#xff1a;不会传输层协议&#xff0c;HCIA都考不过https://mp.weixin.qq.com/s/oKAL8GvdrcHEb5O_8bEZZQ 思科CCNA试听课程&#xff1a;适合初学者&#xff1a;VLAN原理与配置https://mp.weixin.qq.com/s/toIJg1EVFImalrwzbTONTQ 组网图形 组网需求 通过Cons…

设计模式之责任链模式

文章目录 1、基本介绍2、包含角色3、场景推导4、责任链模式的优缺点5、使用场景 1、基本介绍 王二狗本来是干Android开发的&#xff0c;最近公司想让他把IOS的活也干了&#xff0c;但是Windows笔记本不能开发IOS&#xff0c;所以二狗提出买一台Mac笔记本电脑。这花钱的事需要领…

css animation 鼠标移入暂停会抖动

如图 实现一个赞助商横向滚动列表墙&#xff0c; 上下两排向右滚动&#xff0c;中间向左滚动&#xff0c;鼠标移入暂停当前行。 实现&#xff1a; // 使用animation.moving {animation: move 20s linear infinite; }keyframes move {0% {}100% {transform: translateX(-50%);…

node版本控制工具nvm使用笔记

由于不同的项目所需要的node环境不同&#xff0c;所以在运行支持node 12或者node 16版本的项目时卸载安装不同版本的node非常麻烦&#xff0c;恰巧公司有一个热心的同事告诉我可以使用nvm来进行版本控制&#xff0c;我使用了之后发现确实好用&#xff0c;写一篇笔记记录一下。 …

C#内存不够解决方法

今天在使用C#程序的时候&#xff0c;出现了下图的问题&#xff1a; 注意下图中我用红框标出的位置&#xff0c;实际是一个三维数组。 但是出现这个问题和三维数组没有关系。 他是提示内存不足。 百度了一下&#xff0c;C#在生成的过程中如果是生成对应的32位系统&#xff0c…

【优选算法】—— 滑动窗口类问题

本期&#xff0c;我给大家带来的是关于滑动窗口类算法的介绍&#xff0c;并通过具体的题目帮助大家思考理解。 目录 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;题目讲解 1、难度&#xff1a;medium 1️⃣长度最小的子数组 2️⃣找到字符串中所有字⺟…