BUUCTF Reverse/[2019红帽杯]childRE

news2024/10/7 2:19:53

查看信息

在这里插入图片描述

分析代码

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

  memset(input, 0, sizeof(input));
  sub_7FF714171080("%s", (const char *)input);
  v3 = -1i64;
  do
    ++v3;
  while ( *((_BYTE *)input + v3) );
  if ( v3 != 0x1F )                             // 输入字符串长度为32
  {
    while ( 1 )
      Sleep(0x3E8u);
  }
  v4 = sub_7FF714171280(input);                 // 加密(打乱顺序)
  v5 = name;
  if ( v4 )
  {
    sub_7FF7141715C0((unsigned __int8 *)v4[1]);  //打乱顺序
    sub_7FF7141715C0(*(unsigned __int8 **)(v6 + 16));
    v7 = dword_7FF7141757E0;
    v5[dword_7FF7141757E0] = *v8;
    dword_7FF7141757E0 = v7 + 1;
  }
  UnDecorateSymbolName(v5, outputString, 0x100u, 0);
  v9 = -1i64;
  do
    ++v9;
  while ( outputString[v9] );
  if ( v9 == 0x3E )
  {
    v12 = 0;
    v13 = 0i64;
    do                                                  //比较结果
    {
      if ( a1234567890Qwer[outputString[v13] % 23] != a46200860044218[v13] )
        _exit(v12);
      if ( a1234567890Qwer[outputString[v13] / 23] != a55565653255552[v13] )
        _exit(v12 * v12);
      ++v12;
      ++v13;
    }
    while ( v12 < 62 );
    sub_7FF714171020("flag{MD5(your input)}\n");
    return 0;
  }
  else
  {
    v10 = sub_7FF7141718A0(std::cout);
    std::ostream::operator<<(v10, sub_7FF714171A60);
    return -1;
  }
}

可以先写脚本将outputstring中的值给求出来

a123 = [0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 
  0x2D, 0x3D, 0x21, 0x40, 0x23, 0x24, 0x25, 0x5E, 0x26, 0x2A, 
  0x28, 0x29, 0x5F, 0x2B, 0x71, 0x77, 0x65, 0x72, 0x74, 0x79, 
  0x75, 0x69, 0x6F, 0x70, 0x5B, 0x5D, 0x51, 0x57, 0x45, 0x52, 
  0x54, 0x59, 0x55, 0x49, 0x4F, 0x50, 0x7B, 0x7D, 0x61, 0x73, 
  0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x3B, 0x27, 0x41, 
  0x53, 0x44, 0x46, 0x47, 0x48, 0x4A, 0x4B, 0x4C, 0x3A, 0x22, 
  0x5A, 0x58, 0x43, 0x56, 0x42, 0x4E, 0x4D, 0x3C, 0x3E, 0x3F, 
  0x7A, 0x78, 0x63, 0x76, 0x62, 0x6E, 0x6D, 0x2C, 0x2E, 0x2F, 
  ]
a462 = "(_@4620!08!6_0*0442!@186%%0@3=66!!974*3234=&0^3&1@=&0908!6_0*&"
a555 = "55565653255552225565565555243466334653663544426565555525555222"


outputString = ""

for i in range(62):
    for j in range(33,128):
        if(a123[j % 23] == ord(a462[i]) and a123[j // 23] == ord(a555[i]) ):
            outputString += chr(j)
            break
        else:
            continue
print(outputString)
#  结果
private:char*__thiscallR0Pxx::My_Aut0_PWN(unsignedchar*)

然后就是这个函数了,可以参考unDecorateSymbolName 函数 以及 c, c++函数名编译符号修饰符说明

 UnDecorateSymbolName(v5, outputString, 0x100u, 0);

思路可以参考这个大佬的博客

C++的类成员函数(其调用方式是thiscall)。函数的名字修饰与非成员的C++函数稍有不同,首先就是在函数名字和參数表之间插入以“@”字 符引导的类名

简单来说就是以 @ 来分割,对应关系如下

?         My_Aut0_PWN  @R0Pxx        @@AAE                    PA            D              PA        E                 @Z
以?开始    函数名       类名    私有(private)成员函数的标识    返回指针  char拼写代号          参数指针  unsigned拼写代号          结束

合起来就是 ?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z

接下来分析这段代码

  if ( v4 )
  {
    sub_7FF7141715C0((unsigned __int8 *)v4[1]);
    sub_7FF7141715C0(*(unsigned __int8 **)(v6 + 16));
    v7 = dword_7FF7141757E0;
    v5[dword_7FF7141757E0] = *v8;
    dword_7FF7141757E0 = v7 + 1;
  }

感觉像个二叉树遍历,试了下还原二叉树但是咋搞都不对

__int64 __fastcall sub_7FF7141715C0(unsigned __int8 *a1)
{
  int v2; // er8
  __int64 result; // rax

  if ( a1 )
  {
    sub_7FF7141715C0(*((_QWORD *)a1 + 1));
    sub_7FF7141715C0(*((_QWORD *)a1 + 2));
    v2 = dword_7FF7141757E0;
    result = *a1;
    name[dword_7FF7141757E0] = result;
    dword_7FF7141757E0 = v2 + 1;
  }
  return result;
}

参考这个大佬的博客
直接在输入的时候使用 “ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_” 刚好对应65~95

得出结果为 “PQHRSIDTUJVWKEBXYLZ[MF\]N^_OGCA”,减去 ‘A’ 刚好对应每个数的下标

写出脚本

from hashlib import md5

index = "PQHRSIDTUJVWKEBXYLZ[MF\]N^_OGCA"

s = "?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z"

flag_1 = [0] * 31

for i in range(31):
    flag_1[ord(index[i]) - ord('A')] = s[i]
flag = ""
for i in flag_1:
    flag = flag + str(i)
print(flag)
print(md5(flag.encode('utf-8')).hexdigest())

得到结果为

Z0@tRAEyuP@xAAA?M_A0_WNPx@@EPDP
63b148e750fed3a33419168ac58083f5

flag{63b148e750fed3a33419168ac58083f5}

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

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

相关文章

基于人工智能与边缘计算Aidlux的工业表面缺陷检测

一&#xff1a;训练yolov8得到onnx模型&#xff08;相关教程有很多&#xff09; 二&#xff1a;模型转化&#xff1a; 网站&#xff1a; https://aimo.aidlux.com/ 输入试用账号和密码: 账号:AIMOTC001&#xff0c;密码:AIMOTC001 我们选择 TensorFlowLite 一步步完成转化 …

自然语言处理应用(二):自然语言推断

自然语言推断 自然语言推断&#xff08;Natural Language Inference&#xff09;是指通过对自然语言文本进行逻辑推理和推断&#xff0c;判断两个句子之间的关系&#xff0c;通常包括三种关系&#xff1a;蕴含&#xff08;entailment&#xff09;、矛盾&#xff08;contradict…

Java通过http请求的方式调用他人的接口

本功能的实现&#xff0c;去不参数于这篇博客&#xff0c;给这位大神点赞 基于Spring Boot使用Java调用http请求的6种方式 文章目录 业务背景第一步&#xff0c;配置url第二步&#xff0c;封装请求体&#xff0c;RequestBody第三步&#xff0c;使用HttpURLConnection调用服务…

机器学习(8)---数据预处理

文章目录 一、数据预处理1.1 数据无量纲化1.2 数据归一化1.3 数据标准化1.4 处理选择 二、缺失值2.1 填补的类和参数2.2 用Pandas和Numpy进行填补 三、处理分类型特征&#xff1a;编码与哑变量3.1 编码3.2 哑变量&#xff08;独热编码&#xff09; 一、数据预处理 1.1 数据无量…

【java】【SSM框架系列】【二】SpringMVC

目录 一、SpringMVC简介 1.1 SpringMVC概述 1.2 入门案例 1.3 入门案例工作流程分析 1.4 Conrtoller加载控制与业务BEAN加载控制 1.5 PostMan 二、请求与响应 2.1 请求映射路径 2.2 请求参数 2.2.1 Get 2.2.2 Post 2.2.3 SpringMVC解决post请求中文乱码处理 2.2.4 …

有效回文字符串(Valid palindrome)

题目描述 思路分析 代码实践 java: public class Solutation1 {//定义一个方法&#xff0c;判断是否是有效数字或者字母private static boolean isValid(char c) {//如果不是字母或者数字&#xff0c;那就返回一个flase//这里调用了Character类里面的方法return Character.i…

openwrt开启SSH远程访问与开启WEB远程访问——三种方法

openwrt 开启SSH远程访问 首先&#xff0c;你的电脑用网线连接路由器LAN口是可以访问WEB页面和SSH连接的。 例如&#xff0c;电脑1连接Openwrt路由器&#xff0c;可以进行SSH连接到openwrt 路由器。但是电脑2无法远程访问Openwrt路由器网页和SSH远程连接。 本次操作固件版本…

前端面试题JS篇(5)

如何判断一个对象是空对象 1、使用 JSON 自带的stringify方法判断 let obj{}; console.log(JSON.stringify(obj)"{}"); 2、使用 ES6 新增的方法 Object.keys()来判断 Object.keys(obj).length0 如果 new 一个箭头函数的会怎么样 箭头函数是ES6中的提出来的&…

python main 函数-启动-传递参数 python 打包 exe C# 进程传参

Part1:Python main 传递参数 在Python编程中&#xff0c;我们经常需要从命令行或其他外部环境中获取参数。Python提供了一种简单而灵活的方式来处理这些参数&#xff0c;即通过main函数传参 1.python main 函数-启动-传递参数 test.py import sysdef main():# 获取命令行参…

代码随想录算法训练营day48|打家劫舍 |198.打家劫舍|213.打家劫舍II|337.打家劫舍 III

198.打家劫舍 力扣题目链接 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给…

Pytorch intermediate(三) BiLSTM

Bi-directional Long Short-Term Memory&#xff0c;双向LSTM网络。 有些时候预测可能需要由前面若干输入和后面若干输入共同决定&#xff0c;这样会更加准确。因此提出了双向循环神经网络&#xff0c;网络结构如上图。 构建LSTM模型时&#xff0c;在参数中添加bidirectionalTr…

面试半个月后的一些想法

源于半个月面试经历后的一些想法&#xff0c;刚开始想的是随便写写&#xff0c;没想到居然写了这么多。 找不到目标找不到意义亦或是烦躁的时候&#xff0c;就写写文章吧&#xff0c;把那些困扰你很久的问题铺开来 花时间仔细想想&#xff0c;其实真正让我们生气懊恼&#xff0…

轻松搭建本地知识库的ChatGLM2-6B

近期发现了一个项目&#xff0c;它的前身是ChatGLM&#xff0c;在我之前的博客中有关于ChatGLM的部署过程&#xff0c;本项目在前者基础上进行了优化&#xff0c;可以基于当前主流的LLM模型和庞大的知识库&#xff0c;实现本地部署自己的ChatGPT&#xff0c;并可结合自己的知识…

华为OD机考算法题:分奖金

题目部分 题目分奖金难度难题目说明公司老板做了一笔大生意&#xff0c;想要给每位员工分配一些奖金&#xff0c;想通过游戏的方式来决定每个人分多少钱。按照员工的工号顺序&#xff0c;每个人随机抽取一个数字。按照工号的顺序往后排列&#xff0c;遇到第一个数字比自己数字…

我们这一代人的机会是什么?

大家好&#xff0c;我是苍何&#xff0c;今天作为专业嘉宾参观了 2023 年中国国际智能产业博览会&#xff08;智博会&#xff09;&#xff0c;是一场以「智汇八方&#xff0c;博采众长」为主题的汇聚全球智能技术和产业创新的盛会&#xff0c;感触颇深&#xff0c;随着中国商业…

在Linux(Centos7)上编译whisper.cpp的详细教程

whisper.cpp的简单介绍&#xff1a; Whisper 是 OpenAI 推出的一个自动语音识别&#xff08;ASR&#xff09;系统&#xff0c;whisper.cpp 则是 Whisper 模型的 C/C 移植。whisper.cpp 具有无依赖项、内存使用量低等特点&#xff0c;支持 Mac、Windows、Linux、iOS 和 Android …

免费开源音乐聚合软件-洛雪音乐助手

一、软件介绍 洛雪音乐助手&#xff08;LX Music&#xff09;&#xff0c;一个基于 Electron Vue 开发的免费开源音乐聚合软件&#xff0c;软件聚合多个音乐平台搜索接口&#xff0c;提供音乐在线播放和下载&#xff0c;而且免费无广告&#xff0c;支持在Windows、Mac OS、L…

CSP 202109-1 数值推导

答题 一眼看上去好像有点复杂&#xff0c;稍微想一下就知道&#xff0c;最大值就是把所有B加起来&#xff0c;最小值就是把不重复的B加起来&#xff0c;用set搞定不重复的元素 #include<iostream> #include<set> using namespace std; int main(){int n,max0,min0…

ARM接口编程—Interrupt(exynos 4412平台)

CPU与硬件的交互方式 轮询 CPU执行程序时不断地询问硬件是否需要其服务&#xff0c;若需要则给予其服务&#xff0c;若不需要一段时间后再次询问&#xff0c;周而复始中断 CPU执行程序时若硬件需要其服务&#xff0c;对应的硬件给CPU发送中断信号&#xff0c;CPU接收到中断信号…

SOC 2.0安全运营中心

SOC&#xff0c;安全运营中心&#xff0c;为取得其最佳效果&#xff0c;以及真正最小化网络风险&#xff0c;需要全员就位&#xff0c;让安全成为每个人的责任。 早在几年前&#xff0c;企业就开始创建SOC来集中化威胁与漏洞的监视和响应。第一代SOC的目标&#xff0c;是集中管…