IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 简单逆向26(c++函数修饰名,md5,动态调试,算法逆向) -> 正文阅读

[C++知识库]简单逆向26(c++函数修饰名,md5,动态调试,算法逆向)

诺莫26

开始:

放入IDA,找到字符串:
在这里插入图片描述
找到main函数:

signed __int64 main()//重命名
{
  signed __int64 v0; // rax
  __int64 v1; // rax
  const CHAR *v2; // r11
  __int64 v3; // r10
  __int64 v4; // r9
  const CHAR *v5; // r10
  signed __int64 v6; // rcx
  __int64 v7; // rax
  signed __int64 result; // rax
  unsigned int v9; // ecx
  __int64 v10; // r9
  int v11; // er10
  __int64 v12; // r8
  __int128 v13; // [rsp+20h] [rbp-38h]
  __int128 v14; // [rsp+30h] [rbp-28h]

  v13 = 0i64;
  v14 = 0i64;
  sub_140001080("%s", &v13);//scanf
  v0 = -1i64;
  do
    ++v0;
  while ( *((_BYTE *)&v13 + v0) );
  if ( v0 != 31 )
  {
    while ( 1 )
      Sleep(0x3E8u);
  }
  v1 = sub_140001280(&v13);
  v2 = name;
  if ( v1 )
  {
    sub_1400015C0(*(_QWORD *)(v1 + 8));
    sub_1400015C0(*(_QWORD *)(v3 + 16));
    v4 = dword_1400057E0;
    v2[v4] = *v5;
    dword_1400057E0 = v4 + 1;
  }
  UnDecorateSymbolName(v2, outputString, 0x100u, 0);
  v6 = -1i64;
  do
    ++v6;
  while ( outputString[v6] );
  if ( v6 == 62 )
  {
    v9 = 0;
    v10 = 0i64;
    do
    {
      v11 = outputString[v10];
      v12 = v11 % 23;
      if ( a1234567890Qwer[v12] != *(_BYTE *)(v10 + 5368722552i64) )
        _exit(v9);
      if ( a1234567890Qwer[v11 / 23] != *(_BYTE *)(v10 + 5368722488i64) )
        _exit(v9 * v9);
      ++v9;
      ++v10;
    }
    while ( v9 < 0x3E );
    sub_140001020("flag{MD5(your input)}\n", v11 / 23, v12, v10);
    result = 0i64;
  }
  else
  {
    v7 = sub_1400018A0(std::cout);
    std::basic_ostream<char,std::char_traits<char>>::operator<<(v7, sub_140001A60);
    result = 0xFFFFFFFFi64;
  }
  return result;
}

大概看了下,倒着解吧:

do
    {
      v11 = outputString[v10];
      v12 = v11 % 23;
      if ( a1234567890Qwer[v12] != *(_BYTE *)(v10 + 5368722552i64) )
        _exit(v9);
      if ( a1234567890Qwer[v11 / 23] != *(_BYTE *)(v10 + 5368722488i64) )
        _exit(v9 * v9);
      ++v9;
      ++v10;
    }
    while ( v9 < 0x3E );

这里需要动态调试;
在这里插入图片描述
找数据;
在这里插入图片描述

data1 = "1234567890-=!@#$%^&*()_+qwertyuiop[]QWERTYUIOP{}asdfghjkl;'ASDFGHJKL:\"ZXCVBNM<>?zxcvbnm,./"
data2 = '(_@4620!08!6_0*0442!@186%%0@3=66!!974*3234=&0^3&1@=&0908!6_0*&'
data3 = '55565653255552225565565555243466334653663544426565555525555222'

然后顺便看一下outputString:
在这里插入图片描述
看来就是我们输入的字符打乱了顺序;
那我们先逆向出被打乱顺序的输入字符,然后尝试找到原字符:

data1 = "1234567890-=!@#$%^&*()_+qwertyuiop[]QWERTYUIOP{}asdfghjkl;'ASDFGHJKL:\"ZXCVBNM<>?zxcvbnm,./"
data2 = '(_@4620!08!6_0*0442!@186%%0@3=66!!974*3234=&0^3&1@=&0908!6_0*&'
data3 = '55565653255552225565565555243466334653663544426565555525555222'

for i in range(62):
    pos1 = data1.index(data2[i])
    pos2 = data1.index(data3[i])
    print(chr(pos2 * 23 + pos1), end = '')
print()

结果:
private: char * __thiscall R0Pxx::My_Aut0_PWN(unsigned char *)

好像是一个类函数,outputString是在折这里生成的在这里插入图片描述
查了这个函数;

那我们要了解c++的函数修饰方式:
c++函数修饰名的方法

然后修饰后的函数应该是:
?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z
是咋样打乱的呢,我们用坐标跟踪:
然后再进行md5解码:

import hashlib

data1 = "1234567890-=!@#$%^&*()_+qwertyuiop[]QWERTYUIOP{}asdfghjkl;'ASDFGHJKL:\"ZXCVBNM<>?zxcvbnm,./"
data2 = '(_@4620!08!6_0*0442!@186%%0@3=66!!974*3234=&0^3&1@=&0908!6_0*&'
data3 = '55565653255552225565565555243466334653663544426565555525555222'

for i in range(62):
    pos1 = data1.index(data2[i])
    pos2 = data1.index(data3[i])
    print(chr(pos2 * 23 + pos1), end = '')
print()

#private: char * __thiscall R0Pxx::My_Aut0_PWN(unsigned char *)
#?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z LEN = 31
#0123456789:;<=>?@ABCDEFGHIJKLMN
#"?@7AB83CD9EF:41GH;IJ<5KL=MN>620"

pos2 = "?@7AB83CD9EF:41GH;IJ<5KL=MN>620"
data4 = '?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z'
inp = [0]*31
for i in range(31):
    inp[ord(pos2[i]) - ord('0')] = data4[i]
inp_a = "".join(inp)
inmd5 = hashlib.md5()
inmd5.update(inp_a.encode("utf-8"))


print(inmd5.hexdigest())

在这里插入图片描述
了解到打乱的方式是二叉数;

说明:
判断?开头:
在这里插入图片描述
如果不是不会反修饰。所以我们动态调试的时候打乱的字符串是什么,outputString就是什么;当然也可以看上面的其他数据

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-09 10:03:37  更:2021-08-09 10:05:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 21:51:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码