[2019红帽杯]childRE

前言

可恶,什么鬼天气停了两天电还有大雨

分析

[2019红帽杯]childRE_第1张图片
三个加密步骤:

  • 二叉树后序遍历
  • c++函数名修饰
  • 不同表索引取值
    倒着看吧

余商

在这里插入图片描述
用python脚本写着要简单一点

table2 = "55565653255552225565565555243466334653663544426565555525555222"
table1 = '(_@4620!08!6_0*0442!@186%%0@3=66!!974*3234=&0^3&1@=&0908!6_0*&'
key = '1234567890-=!@#$%^&*()_+qwertyuiop[]QWERTYUIOP{}asdfghjkl;\x27ASDFGHJKL:"ZXCVBNM<>?zxcvbnm,./'
str = ''
for i in range(62):
    str += chr(key.find(table2[i]) * 23 + key.find(table1[i]))
    print(str)

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

函数名修饰

UnDecorateSymbolName函数是一个用于取消指定修饰的C++符号名称的函数,函数名修饰主要作用域链接器,由编译器生成,让链接器能够区分同一函数名,用于函数重载等方面

?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z

?是一个前缀,My_Aut0_PWN是函数名,@R0Pxx@@表示函数属于类R0PxxAAE表示函数是私有的(private)并且使用__thiscall调用约定,PAD表示返回值是指针类型(char *),PAE表示参数是指针类型(unsigned char *),@Z表示结尾

二叉树

[2019红帽杯]childRE_第2张图片
看着像后序遍历,对于这种排序可以通过输入固定序列字符串来定位位置变化情况,一个师傅的wp挺巧妙的

#include 
#include 
int main()
{
	char str[] = "?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z";
	int num[] = { 0x50, 0x51, 0x48, 0x52, 0x53, 0x49, 0x44, 0x54, 0x55, 0x4a, 0x56, 0x57, 0x4b, 0x45, 0x42, 0x58, 0x59, 0x4c, 0x5a, 0x5b, 0x4d, 0x46, 0x5c, 0x5d, 0x4e, 0x5e, 0x5f, 0x4f, 0x47, 0x43, 65 };
	char input[32] = { 0 };
	int i;
	for (i = 0; i < 31; i++)
		input[num[i] - 65] = str[i];
	printf(input);
	return 0;
}

Z0@tRAEyuP@xAAA?M_A0_WNPx@@EPDP

flag{63b148e750fed3a33419168ac58083f5}
参考链接:
https://blog.csdn.net/wenqiang1208/article/details/53163788

你可能感兴趣的:(逆向,CTF)