Objects in memory
Last updated
Last updated
AWSハッキングの学習と練習:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングの学習と練習: HackTricks Training GCP Red Team Expert (GRTE)
CF*オブジェクトはCoreFoundationから来ており、CFString
、CFNumber
、CFAllocatior
などの50以上のオブジェクトクラスを提供しています。
これらのクラスはすべてCFRuntimeClass
クラスのインスタンスであり、呼び出されると__CFRuntimeClassTable
へのインデックスを返します。CFRuntimeClassはCFRuntime.hで定義されています。
ObjectiveCランタイムによって使用されるデータのほとんどは実行中に変化するため、メモリ内の**__DATA**セグメントからいくつかのセクションを使用します:
__objc_msgrefs
(message_ref_t
): メッセージの参照
__objc_ivar
(ivar
): インスタンス変数
__objc_data
(...
): ミュータブルデータ
__objc_classrefs
(Class
): クラスの参照
__objc_superrefs
(Class
): 親クラスの参照
__objc_protorefs
(protocol_t *
): プロトコルの参照
__objc_selrefs
(SEL
): セレクタの参照
__objc_const
(...
): クラスのr/o
データおよびその他の(おそらく)定数データ
__objc_imageinfo
(version, flags
): イメージの読み込み中に使用されます: 現在のバージョンは0
です。フラグは事前に最適化されたGCサポートなどを指定します。
__objc_protolist
(protocol_t *
): プロトコルリスト
__objc_nlcatlist
(category_t
): このバイナリで定義されたNon-Lazyカテゴリへのポインタ
__objc_catlist
** (category_t
): このバイナリで定義されたカテゴリへのポインタ
__objc_nlclslist
(classref_t
): このバイナリで定義されたNon-Lazy Objective-Cクラスへのポインタ
__objc_classlist
(classref_t
): このバイナリで定義されたすべてのObjective-Cクラスへのポインタ
また、定数値を格納するために**__TEXT
**セグメント内のいくつかのセクションを使用します:
__objc_methname
(C-String): メソッド名
__objc_classname
(C-String): クラス名
__objc_methtype
(C-String): メソッドの型
Objective-Cは、単純および複雑な型のセレクターおよび変数の型をエンコードするためにいくつかのマングリングを使用します:
プリミティブ型は、型の最初の文字を使用します。たとえば、int
の場合はi
、char
の場合はc
、long
の場合はl
... そして、符号なしの場合は大文字を使用します(unsigned Long
の場合はL
)。
他のデータ型で使用される文字や特殊な文字を使用する場合は、q
はlong long
、b
はビットフィールド
、B
はブール値
、#
はクラス
、@
はid
、*
はcharポインタ
、^
は一般的なポインタ
、?
は未定義
です。
配列、構造体、および共用体は、[
, {
, (
を使用します。
セレクタは processString:withOptions:andError:
になります。
id
は @
とエンコードされます
char *
は *
とエンコードされます
メソッドの完全なタイプエンコーディングは:
戻り値の型 (NSString *
): @
としてエンコードされ、長さ 24 で表される
self
(オブジェクトインスタンス): @
としてエンコードされ、オフセット 0 に位置する
_cmd
(セレクタ): :
としてエンコードされ、オフセット 8 に位置する
最初の引数 (char * input
): *
としてエンコードされ、オフセット 16 に位置する
二番目の引数 (NSDictionary * options
): @
としてエンコードされ、オフセット 20 に位置する
三番目の引数 (NSError ** error
): ^@
としてエンコードされ、オフセット 24 に位置する
セレクタとエンコーディングを組み合わせることで、メソッドを再構築できます。
Objective-Cにおけるクラスは、プロパティ、メソッドポインタなどを持つ構造体です。ソースコード内で objc_class
構造体を見つけることができます。
このクラスは、isaフィールドの一部ビットを使用してクラスに関する情報を示します。
その後、構造体には、クラスの名前、基本メソッド、プロパティ、インスタンス変数などの属性を含むディスク上に保存された構造体class_ro_t
へのポインタがあります。
ランタイム中には、メソッド、プロトコル、プロパティなどを変更できるポインタを含む追加の構造体class_rw_t
が使用されます。