[2019红帽杯]CHILDRE(c++逆向+函数调用约定+c++修饰符转换+异或+黑盒分析+爆破)
这里就直接用z3写脚本将我们的outoutstring爆出来。
outputString = private: char * __thiscall R0Pxx::My_Aut0_PWN(unsigned char *)
这个函数比关键。
官方文档,大致可以知道这个函数的作用就是将我们的flag进行转换,转换成了c++函数模式。也就是说我们的flag就是outoutstring,这个函数的C++函数名修饰
对于C++函数名修饰,这个需要了解函数调用约定
了解之后,我们可以将未转换的outoutstring得出:?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z
通过这里,我们可以判断出我们的flag有着31位
对于这一堆函数,我们进行动态调试,我们输入有序字母。
进入这个函数,我们可以发现
可以发现我们输入的数据被打乱了
我们输入31个有序数据,12345ABCDEFGHIJKLMNOPQRSTUWXYZ,
得出乱序后的表,然后写脚本进行还原。
#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加密即可