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
、またはCFAllocator
のような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
): このバイナリで定義された非遅延カテゴリへのポインタ
__objc_catlist
(category_t
): このバイナリで定義されたカテゴリへのポインタ
__objc_nlclslist
(classref_t
): このバイナリで定義された非遅延Objective-Cクラスへのポインタ
__objc_classlist
(classref_t
): このバイナリで定義されたすべてのObjective-Cクラスへのポインタ
また、書き込みが不可能な場合に定数値を格納するために、**__TEXT
**セグメント内のいくつかのセクションも使用します:
__objc_methname
(C-String): メソッド名
__objc_classname
(C-String): クラス名
__objc_methtype
(C-String): メソッドタイプ
Objective-Cは、セレクタと変数の型を単純および複雑な型のエンコードにいくつかのマングリングを使用します:
プリミティブ型は、型の最初の文字を使用します。i
はint
、c
はchar
、l
はlong
... そして符号なしの場合は大文字を使用します(L
はunsigned Long
)。
他のデータ型は、使用される文字や特別な文字に対して、q
はlong long
、b
はbitfields
、B
はbooleans
、#
はclasses
、@
はid
、*
はchar pointers
、^
は一般的なpointers
、?
はundefined
を使用します。
配列、構造体、共用体は[
、{
、(
を使用します。
セレクタは processString:withOptions:andError:
になります。
id
は @
としてエンコードされます
char *
は *
としてエンコードされます
メソッドの完全な型エンコーディングは:
戻り値の型 (NSString *
): @
でエンコードされ、長さは 24
self
(オブジェクトインスタンス): @
でエンコードされ、オフセット 0
_cmd
(セレクタ): :
でエンコードされ、オフセット 8
最初の引数 (char * input
): *
でエンコードされ、オフセット 16
2 番目の引数 (NSDictionary * options
): @
でエンコードされ、オフセット 20
3 番目の引数 (NSError ** error
): ^@
でエンコードされ、オフセット 24
セレクタとエンコーディングを使ってメソッドを再構築できます。
Objective-C のクラスは、プロパティ、メソッドポインタを持つ構造体です... 構造体 objc_class
を ソースコード で見つけることができます:
このクラスは、クラスに関する情報を示すためにisaフィールドの一部のビットを使用します。
次に、構造体はディスクに保存されたclass_ro_t
構造体へのポインタを持ち、クラスの名前、基本メソッド、プロパティ、およびインスタンス変数などの属性を含みます。
ランタイム中に、メソッド、プロトコル、プロパティなどのポインタを含む追加の構造体class_rw_t
が使用され、これらは変更可能です。
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する: HackTricks Training GCP Red Team Expert (GRTE)