首页 > 其他分享 >0xGame week2 Re 补

0xGame week2 Re 补

时间:2024-10-22 13:43:32浏览次数:1  
标签:std __ string 0xGame v13 char Re operator week2

0xGame week2 Re 补

Xor::Ramdom

先看代码逻辑:

int __fastcall main(int argc, const char **argv, const char **envp)
{
  __int64 v3; // rax
  char v4; // bl
  bool v5; // si
  bool v6; // bl
  _BYTE *v7; // rdx
  char v8; // al
  int v9; // ebx
  __int64 v10; // rax
  __int64 v11; // rax
  __int64 v13[4]; // [rsp+20h] [rbp-60h] BYREF
  char v14[32]; // [rsp+40h] [rbp-40h] BYREF
  char v15[46]; // [rsp+60h] [rbp-20h] BYREF
  char v16; // [rsp+8Eh] [rbp+Eh] BYREF
  char v17; // [rsp+8Fh] [rbp+Fh] BYREF
  char v18[32]; // [rsp+90h] [rbp+10h] BYREF
  char v19[32]; // [rsp+B0h] [rbp+30h] BYREF
  char v20[39]; // [rsp+D0h] [rbp+50h] BYREF
  char v21; // [rsp+F7h] [rbp+77h]
  int inited; // [rsp+F8h] [rbp+78h]
  int v23; // [rsp+FCh] [rbp+7Ch]

  _main(argc, argv, envp);
  inited = 0;
  v23 = 0;
  v21 = 0;
  std::allocator<char>::allocator(&v16);
  std::string::basic_string(v15, 40i64, 0i64, &v16);
  std::allocator<char>::~allocator(&v16);
  std::allocator<char>::allocator(&v17);
  std::string::basic_string(v14, 32i64, 0i64, &v17);
  std::allocator<char>::~allocator(&v17);
  v13[0] = 0x1221164E1F104F0Ci64;
  v13[1] = 0x171F240A4B10244Bi64;
  v13[2] = 0x1A2C5C2108074F09i64;
  v13[3] = 99338668810000i64;
  v3 = std::operator<<<std::char_traits<char>>(refptr__ZSt4cout, "Input flag here:");
  std::ostream::operator<<(v3, refptr__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_);
  std::operator>><char>(refptr__ZSt3cin, v15);
  v4 = 0;
  v5 = 1;
  if ( std::string::size(v15) == 38 )
  {
    std::string::substr(v18, v15, 0i64, 7i64);
    v4 = 1;
    if ( !(unsigned __int8)std::operator!=<char>(v18, "0xGame{") && *(_BYTE *)std::string::operator[](v15, 37i64) == 125 )
      v5 = 0;
  }
  if ( v4 )
    std::string::~string(v18);
  if ( v5 )
    exit(0);
  std::string::substr(v19, v15, 7i64, 30i64);
  std::string::operator=(v14, v19);
  std::string::~string(v19);
  inited = init_random();
  std::string::basic_string(v20, v14);
  v6 = (unsigned int)check(v20) != 0;
  std::string::~string(v20);
  if ( v6 )
  {
    srand(0x1919810u);
    inited = rand();
  }
  v21 = rand();
  do
  {
    v7 = (_BYTE *)std::string::operator[](v14, v23);
    if ( (v23 & 1) != 0 )
      v8 = v21;
    else
      v8 = v21 + 3;
    *v7 ^= v8;
    v9 = *(char *)std::string::operator[](v14, v23);
    if ( v9 != *(unsigned __int8 *)std::array<unsigned char,32ull>::operator[](v13, v23) )
    {
      v10 = std::operator<<<std::char_traits<char>>(refptr__ZSt4cout, "Wrong.Try again");
      std::ostream::operator<<(v10, refptr__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_);
      exit(0);
    }
    ++v23;
  }
  while ( v23 <= 29 );
  v11 = std::operator<<<std::char_traits<char>>(refptr__ZSt4cout, "Right!");
  std::ostream::operator<<(v11, refptr__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_);
  std::string::~string(v14);
  std::string::~string(v15);
  return 0;
}

乍看上去正确的随机数种子是0x1919810,但认真看一下,发现v6的值与v20(输入)的长度有关。具体来讲,check函数返回的值是:

len(v20)!=30 ? 1 : 0

所以如果srand(0x1919810)被执行,那么v6就是1,也就意味着输入flag的长度不对。所以正确的随机数种子并不是0x1919810。

正确的种子所藏的函数比较隐秘,在第57行的init_random()方法中:

int init_random(void)
{
  srand(0x77u);
  return rand();
}

因此,正确的随机数种子事实上是0x77,v21即为以此为种子产生的随机数。加密逻辑比较简单,就是交替使用v21和v21+3进行异或,以此来获得密文,并将密文与v13中的字符作比较,解密思路比较明确,反异或即可。

然而还有一个问题是如何提取v13。观察发现,v13是一个__int64类型,大小为4的数组,初始化时数组的每一个值都被赋予了一个hex数。在后面的异或加密函数中使用unsigned __int8 *作为指针对v13进行访问。所以事实上是对v13的每个值进行小端序的访问,低位存在低地址,每次取8位,也就是两位十六进制。于是将v13每一行进行倒序并取两字节,就能得到密文,从而写出解密的脚本。

#include<bits/stdc++.h>
using namespace std;
unsigned char v13[] = {
    0x0C, 0x4F, 0x10, 0x1F, 0x4E, 0x16, 0x21, 0x12,
    0x4B, 0x24, 0x10, 0x4B, 0x0A, 0x24, 0x1F, 0x17,
    0x09, 0x4F, 0x07, 0x08, 0x21, 0x5C, 0x2C, 0x1A,
    0x10, 0x1F, 0x11, 0x16, 0x59, 0x5A
};
int main()
{
	srand(0x77);
	int init=rand();
	init=rand();
	for(int i=0;i<30;i++)
	{
		int xorx=(i&1!=0) ? init : init+3;
		printf("%c",v13[i]^xorx);
	}
	return 0;
}
//r4nd0m_i5_n0t_alw4ys_'Random'!

ZzZ(补充)

转换整数的方法还可以:

def int_to_str(num):
    return ''.join([chr((num >> (8*i)) & 0xFF) for i in range(4)])

标签:std,__,string,0xGame,v13,char,Re,operator,week2
From: https://www.cnblogs.com/misaki-mei2024/p/18492500

相关文章

  • React和Vue哪个更适合前端开发
    在前端开发领域,React和Vue一直是两大热门框架。本文深入对比两者在不同维度的表现,包括:1.设计理念和学习曲线;2.数据绑定;3.组件化;4.生态系统和工具;5.性能;6.社区支持;7.企业采用和工作机会。通过全面的比较分析,我们可以发现React和Vue各有优势,选择哪一个框架更多地取决于项目......
  • Pyrene-PEG3-Propargyl|cas:2752164-04-6|Propargyl PEG3 Pyrene|芘甲酰胺-三聚乙二醇-
    Pyrene-PEG3-Propargyl,中文名称为芘甲酰胺-三聚乙二醇-丙炔,以下是对其的详细介绍:一、基本信息英文名称:Pyrene-PEG3-Propargyl别名:PropargylPEG3PyreneCAS号:2752164-04-6分子式:C26H25NO4分子量:415.49纯度:通常95%,适用于科研实验外观:淡黄色或白色固体,具体形态可能因PEG分子量......
  • 域渗透之 内网穿透 隧道技术聊聊看 环境搭建 regeorg技术 proxifier联合使用 一步步让
    Http通道ReGeorg环境搭建win10安装reGeorgwin2003phpstudywin7安装phpstudy软件下载地址通过网盘分享的文件:隧道工具链接:https://pan.baidu.com/s/1Jmh2QbfmIPRdeTuWN9-Dkg?pwd=k81v提取码:k81v试验步骤在win2003和win10之间建立一个隧道那么就将regeorg......
  • 基于 Streamlit 工具开发的创意故事生成器
    以下是对上面运行代码的详细说明:主要构建了一个基于 streamlit 库的创意故事生成器应用程序。首先,引入了 streamlit 库。然后,使用 st.markdown 函数设置了一个居中的标题 创意故事生成器 。接下来,定义了一个名为 validate_input 的函数,用于检查输入字符串是......
  • redis mysql nginx的docker-compose
    redismysqlnginx的docker-composeversion:'3'services:nginx:image:docker.m.daocloud.io/nginx:latestcontainer_name:nginxrestart:unless-stoppedenvironment:TZ:Asia/ShanghaiLANG:en_US.UTF-8volumes:#......
  • 第40篇 ConfuserEx混淆代码,防止反编译
    要想自己的dll或程序禁止被反编译成功,可以使用ConfuserEx混淆代码1.正常反编译1.1创建一个demo控制台新建Test类,写个fun1.2正常编译看的效果目前有很多.NET的反编译工具,例如ILSpy,JustDecompile,dnSpy.下面使用dnSpy对ConsoleApp进行反编译。2.混淆编译dll流程使用Confu......
  • FreeRTOS:任务
    目录一、简介二、任务栈三、任务控制块四、任务状态五、任务调度 五、任务间的通信六、相关API 一、简介    在裸机系统中,系统的主体就是main函数里面顺序执行的无限循环,这个无限循环里面,CPU按照顺序执行代码。在多任务系统中,我们根据功能的不同,把整......
  • 电脑提示directx runtime出错怎么解决?dx错误的解决方法
    DirectXRuntime错误在运行依赖该组件的游戏或应用程序时较为常见,给用户带来了诸多困扰。当出现这种错误时,不仅会影响使用体验,还可能导致程序无法正常运行。例如,在玩一些热门游戏如《无畏契约》《龙珠Z:卡卡罗特》等时,玩家可能会遇到“DirectXRuntimeError”的报错提示,游......
  • 一文彻底弄懂并解决Redis的缓存雪崩,缓存击穿,缓存穿透
    缓存雪崩、缓存击穿、缓存穿透是分布式系统中使用缓存时,常遇到的三类问题,都会对系统性能和稳定性产生严重影响。下面将详细介绍这三者的定义、产生原因、危害以及常见的解决方案。1.缓存雪崩1.1定义缓存雪崩是指在某一时刻,大量缓存同时失效,导致大量请求直接打到数据库层,造成......
  • 磁致伸缩位移传感器 Profibus信号设置从站地址(set slave address)实例
    工具:1.一台个人电脑(PC)2.一张西门子 SIMATIC CP5611介面卡3.西门子 SIMATIC Manager 软体程序:1.把西门子 CP5611介面卡安装到电脑主机底板上,并安装驱动程序。2.检查驱动程序是否成功安装: “控制面板”->“系统”->“硬体”->“设备管理器”。设备管理......