-
-
[原创] 自动化提取protobuf结构体
-
发表于:
2025-3-11 20:16
6556
-
众所周知,国赛非常喜欢在题目中塞进protobuf来????人,所以简单搓了个脚本来梭哈proto
以2024年华北国赛半决赛的proc为例,简单复习一下

程序是个heap菜单题,输入会经过sub_1AA5函数进行处理

这是一个protobuf的反序列化函数,proto的结构体在unk_3C60

简单对应一下,可知name short_name c_name都是unk_2260,即Msg,package_name则为空
其字段内容在values,即off_3B80处

只要把每个字段的name type找到,就可以复原出proto文件了
项目地址在此~
github
struct ProtobufCEnumDescriptor {
uint32_t magic;
const char *name;
const char *short_name;
const char *c_name;
const char *package_name;
unsigned n_values;
const ProtobufCEnumValue *values;
unsigned n_value_names;
const ProtobufCEnumValueIndex *values_by_name;
unsigned n_value_ranges;
const ProtobufCIntRange *value_ranges;
void *reserved1;
void *reserved2;
void *reserved3;
void *reserved4;
};
struct ProtobufCEnumDescriptor {
uint32_t magic;
const char *name;
const char *short_name;
const char *c_name;
const char *package_name;
unsigned n_values;
const ProtobufCEnumValue *values;
unsigned n_value_names;
const ProtobufCEnumValueIndex *values_by_name;
unsigned n_value_ranges;
const ProtobufCIntRange *value_ranges;
void *reserved1;
void *reserved2;
void *reserved3;
void *reserved4;
};
struct ProtobufCFieldDescriptor {
const char *name;
uint32_t id;
ProtobufCLabel label;
ProtobufCType type;
unsigned quantifier_offset;
unsigned offset;
const void *descriptor;
const void *default_value;
uint32_t flags;
unsigned reserved_flags;
void *reserved2;
void *reserved3;
};
struct ProtobufCFieldDescriptor {
const char *name;
uint32_t id;
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!