2019红帽杯-CHILDRE(c++逆向+函数调用约定+c++修饰符转换+异或+黑盒分析+爆破)

二木 王者

[2019红帽杯]CHILDRE(c++逆向+函数调用约定+c++修饰符转换+异或+黑盒分析+爆破)

Untitled

Untitled

Untitled

这里就直接用z3写脚本将我们的outoutstring爆出来。

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

Untitled

这个函数比关键。

官方文档,大致可以知道这个函数的作用就是将我们的flag进行转换,转换成了c++函数模式。也就是说我们的flag就是outoutstring,这个函数的C++函数名修饰

Untitled

对于C++函数名修饰,这个需要了解函数调用约定

函数调用约定 (1)

了解之后,我们可以将未转换的outoutstring得出:?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z

Untitled

通过这里,我们可以判断出我们的flag有着31位

Untitled

对于这一堆函数,我们进行动态调试,我们输入有序字母。

Untitled

进入这个函数,我们可以发现

Untitled

Untitled

可以发现我们输入的数据被打乱了

我们输入31个有序数据,12345ABCDEFGHIJKLMNOPQRSTUWXYZ,

得出乱序后的表,然后写脚本进行还原。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <string.h>
int main()
{
char name[32] = "?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z";
int biao[] = { 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 < strlen(name); i++)
input[biao[i] - 65] = name[i];
puts(input);
return 0;
}

得出Z0@tRAEyuP@xAAA?M_A0_WNPx@@EPDP

然后将我们函数进行md5加密即可

 评论