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

[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加密即可

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值