diosra2’s blog

iOSのJailbreak、ダウングレード

More exploit 32-bit devices using De Rebus Antiquis.

Using xerub's De Rebus Antiquis released May 10, 2018, devices with iOS 7 blobs can now execute unsigned code or untethered jailbreak or etc...

I wrote some untether code based on xerub's exploit (ramdiskF.dmg). I will give a detailed explanation.

 

original (ramdiskF)

Exploit released by xerub. See the original for details.

 

xerub's ramdiskF.dmg

// With ramdiskF of xerub, a device to which exploit is applied is in recovery mode, and arbitrary code execution can be performed.

 

. trigger exploit

. control PC

. run _payload

 

/* payload */

void _payload_n42_11b554a() {

    /* move back SP */

    sp = IMAGE_START + IMAGE_SIZE + IMAGE_HEAP_SIZE + IMAGE_STACK_SIZE; // 0xbfff8000

    

    /* disable interrupts */

    _disable_interrupts();

    _bcopy(IMAGE_START, IMAGE_JUMPADDR, IMAGE_BSS_START - IMAGE_START);

    

    /* apply desired patches, disable auto-boot */

    *(int16_t *)(IMAGE_JUMPADDR + OFFSETOF_CONSOLE) = 0x2400; // just go to console

    *(IMAGE_JUMPADDR + OFFSETOF_GO_COMMAND) = IMAGE_LOADADDR; // go command -> loadaddr

    *(IMAGE_JUMPADDR + OFFSETOF_RSA) = INSN2_MOV_R0_0__STR_R0_R3; // accept unsigned images

    

    /* uncompress nettoyeur */

    _decompress_lzss(dst, dst_sz, nettoyeur, nettoyeur_sz);

    

    _wtf();

    _0x9FF227EC();  // ??

    

    /* run nettoyeur */

    _nettoyeur()

    

    /* jump back to iBoot start point and let it re-run */

    _IMAGE_JUMPADDR();

}

 

-> iBoot restart in a patched state and enters recovery mode. It allow unsigned code execution.

 

Ver1.5 ramdiskF2

This is an exploit created very early for untether boot.

The exploit launches upgrade mode and launches untether when the Recovery Console launches. This was the basis for v2.0 described below. The problem was that you will not be able to enter pwned recovery mode.

 

dora2_yururi's ramdiskF2.dmg

// Very early untethered code

 

. trigger exploit

. control PC

. run _payload

 

/* payload */

void _payload_n42_11b554a() {

    /* move back SP */

    sp = IMAGE_START + IMAGE_SIZE + IMAGE_HEAP_SIZE + IMAGE_STACK_SIZE; // 0xbfff8000

    

    /* disable interrupts */

    _disable_interrupts();

    _bcopy(IMAGE_START, IMAGE_JUMPADDR, IMAGE_BSS_START - IMAGE_START);

    

    /* apply desired patches, disable auto-boot, jump upgrade mode from the recovery console */

    *(int16_t *)(IMAGE_JUMPADDR + OFFSETOF_CONSOLE) = 0x2400; // just go to console

    *(IMAGE_JUMPADDR + OFFSETOF_RECOVERY_CONSOLE) = INSN2_BL_UPGRADE_POINT; // jump upgrade

    *(IMAGE_JUMPADDR + OFFSETOF_RSA) = INSN2_MOV_R0_0__STR_R0_R3; // accept unsigned images

    

    /* uncompress nettoyeur */

    _decompress_lzss(dst, dst_sz, nettoyeur, nettoyeur_sz);

    

    _wtf();

    _0x9FF227EC();  // ??

    

    /* run nettoyeur */

    _nettoyeur()

    

    /* jump back to iBoot start point and let it re-run */

    _IMAGE_JUMPADDR();

}

 

-> Devices enter recovery mode, jump upgrade mode and load "/boot/iBEC" from the system partition.

 

Ver, 2.0 untether code (ramdiskH)

This is an exploit that allows (probably) the most used untether boot.

When the exploit starts, iBoot is patched. With this patch, a new iBoot will be loaded from the iBEC saved in the device in advance from the 4th partition.

 

dora2_yururi's ramdiskH.dmg

// Enable booting with untether. It can load "/boot/iBEC" from the 4th partition to boot the desired unsigned iOS.

 

. trigger exploit

. control PC

. run _payload

 

/* payload */

void _payload_n90_11d257() {

    /* move back SP */

    sp = IMAGE_START + IMAGE_SIZE + IMAGE_HEAP_SIZE + IMAGE_STACK_SIZE;

    

    /* disable interrupts */

    _disable_interrupts();

    

    _bcopy(IMAGE_START, IMAGE_JUMPADDR, IMAGE_BSS_START - IMAGE_START);

    

    /* apply desired patches, jump upgrade mode instead of fsboot etc */

    *(IMAGE_JUMPADDR + 0x358ac) = 0x61660033; // boot-partition: 3

    *(IMAGE_JUMPADDR + 0x44004) = 0x5ff01399; // boot-command: fsboot -> upgrade

    *(IMAGE_JUMPADDR + 0x1404) = INSN2_BL_GOCOMMAND; // set go command

    *(IMAGE_JUMPADDR + OFFSETOF_RSA) = INSN2_MOV_R0_0__STR_R0_R3; // accept unsigned images

    

    /* uncompress nettoyeur */

    _decompress_lzss(dst, dst_sz, nettoyeur, nettoyeur_sz);

    

    /* run nettoyeur */

    _nettoyeur()

    

    _0x5ff20000();

    

    /* jump back to iBoot start point and let it re-run */

    _IMAGE_JUMPADDR();

}

 

-> jump back to iBoot start point, patched iBoot boots as boot-command="upgrade" and load "/boot/iBEC" from the 4th partition.

 

Ver, 3.0 untether code (ramdiskI)

This is the build I recently created.

iBoot no longer reads from the 4th partition. Load iBoot flashed from nand and boot.

Use the trick of pmbonneau's, Change the iBoot tag from ibot to 'ibob', Load the new iBoot into jumpaddr using image_load_type () and call go command to jump.

 

dora2_yururi's ramdiskI.dmg

// load the flashed iboot. There is no need to install iBEC in the 4th partition.

 

. trigger exploit

. control PC

. run _payload

 

/* payload */

int _payload_n90_11d257() {

    /* move back SP */

    sp = IMAGE_START + IMAGE_SIZE + IMAGE_HEAP_SIZE + IMAGE_STACK_SIZE;

    

    /* disable interrupts */

    _disable_interrupts();

    

    _bcopy(IMAGE_START, IMAGE_JUMPADDR, IMAGE_BSS_START - IMAGE_START);

    

    /* apply patches */

    *(IMAGE_JUMPADDR + OFFSETOF_RSA) = INSN2_MOV_R0_0__STR_R0_R3; // accept unsigned images

    _bcopy(OFFSETOF_PAYLOAD, PAYLOAD_ADDR, payload_sz);

    *(IMAGE_JUMPADDR + 0xcd6) = INSN2_BL__imageload; // image_load_func()

    

    /* uncompress nettoyeur */

    _decompress_lzss(dst, dst_sz, nettoyeur, nettoyeur_sz);

    

    /* run nettoyeur */

    _nettoyeur()

    

    _0x5ff20000();

    

    /* jump back to iBoot start point and let it re-run */

    _IMAGE_JUMPADDR();

}

 

-> Load a new iBoot into jumpaddr using image_load_type() func.

-> After iBoot restarts, call _image_load_func(). (Immediately after loading nand_firmware)

-> After loading the image into jumpaddr, branch to the go command and jump to the image.

 

/* image_load_type */

int image_load_type(addr_t *addr, size_t *length, uint32_t type);

 

/* new payload */

void _image_load_func() {

    _disable_interrupts();

    *addr = IMAGE_JUMPADDR;

    *length = 0x100000;

    type = 0x69626F62;

    image_load_type(addr, length, type);

    _jump_go_command+1();

}

 

void _jump_go_command() {

    r1 = IMAGE_JUMPADDR;

    _go_command();

}

 

Video

https://video.twimg.com/ext_tw_video/1225441242495873025/pu/vid/720x1280/KuvLOljcPvXcNpB9.mp4

 

Boot Log (via serial)

pinot_init()

mipi_dsim_init()

pinot_init(): pinot_panel_id:      0xa19705c8

pinot_init(): pinot_default_color: 0x00000000

pinot_init(): pinot_backlight_cal: 0x00000000

paint_install_gamma_table: Found Gamma table 0x00970548 / 0x00ffff7f

[NAND] h2fmiPrintConfig:544 Chip ID 98 EE 95 32 7A 55 on FMI0:CE0

[NAND] h2fmiPrintConfig:544 Chip ID 98 EE 95 32 7A 55 on FMI0:CE1

[NAND] h2fmiPrintConfig:544 Chip ID 98 EE 95 32 7A 55 on FMI1:CE8

[NAND] h2fmiPrintConfig:544 Chip ID 98 EE 95 32 7A 55 on FMI1:CE9

 

 

=======================================

::

:: iBoot for n90ap, Copyright 2013, Apple Inc.

::

:: BUILD_TAG: iBoot-1940.10.58

::

:: BUILD_STYLE: RELEASE

::

:: USB_SERIAL_NUMBER: CPID:8930 CPRV:20 CPFM:03 SCEP:02 BDID:00 ECID:XXXXXXXXXXXXXXXX IBFL:1B SRNM:[XXXXXXXXXXX]

::

=======================================

 

[FTL:MSG] Apple NAND Driver (AND) RO

[NAND] h2fmiPrintConfig:544 Chip ID 98 EE 95 32 7A 55 on FMI0:CE0

[NAND] h2fmiPrintConfig:544 Chip ID 98 EE 95 32 7A 55 on FMI0:CE1

[NAND] h2fmiPrintConfig:544 Chip ID 98 EE 95 32 7A 55 on FMI1:CE8

[NAND] h2fmiPrintConfig:544 Chip ID 98 EE 95 32 7A 55 on FMI1:CE9

[FTL:MSG] FIL_Init            [OK]

[FTL:MSG] BUF_Init            [OK]

[FTL:MSG] FPart Init          [OK]

read new style signature 0x43313131 (line:389)

[FTL:MSG] VSVFL Register  [OK]

[WMR:MSG] Metadata whitening is set in NAND signature

[FTL:MSG] VFL Init            [OK]

[FTL:MSG] VFL_Open            [OK]

[FTL:MSG] YAFTL Register  [OK]

[FTL:MSG] FTL_Open            [OK]

Boot Failure Count: 0 Panic Fail Count: 0

Delaying boot for 0 seconds. Hit enter to break into the command prompt...

HFSInitPartition: 0x5ffb5580

image 0x5ff6f680: bdev 0x5ff56700 type SCAB offset 0x600

image 0x5ff6f700: bdev 0x5ff56700 type ibo6 offset 0x1200 len 0x440ac

image 0x5ff6f780: bdev 0x5ff56700 type ibot offset 0x45c00 len 0x45178

image 0x5ff6f800: bdev 0x5ff56700 type dtre offset 0x8b200 len 0x11a78

image 0x5ff6f880: bdev 0x5ff56700 type logo offset 0x9d800 len 0x1a78

image 0x5ff6f900: bdev 0x5ff56700 type bat0 offset 0x9f600 len 0xaa38

image 0x5ff6f980: bdev 0x5ff56700 type bat1 offset 0xaa400 len 0x7f8

image 0x5ff6fa00: bdev 0x5ff56700 type glyC offset 0xab000 len 0x1478

image 0x5ff70380: bdev 0x5ff56700 type chg0 offset 0xace00 len 0x25f8

image 0x5ff70400: bdev 0x5ff56700 type chg1 offset 0xaf800 len 0x88b8

image 0x5ff70480: bdev 0x5ff56700 type glyP offset 0xb8200 len 0x2e38

image 0x5ff70500: bdev 0x5ff56700 type batF offset 0xbb200 len 0x14838

image 0x5ff70580: bdev 0x5ff56700 type recm offset 0xcfc00 len 0x10f38

image 0x5ff70600: bdev 0x5ff56700 type log6 offset 0xe1000 len 0x32f8

image 0x5ff70680: bdev 0x5ff56700 type rec6 offset 0xe4c00 len 0x1e5f8

jumping into image at 0x44000000

image 0x5ff54880: bdev 0x5ff55380 type SCAB offset 0x600

image 0x5ff54900: bdev 0x5ff55380 type ibo6 offset 0x1200 len 0x440ac

image 0x5ff54980: bdev 0x5ff55380 type ibot offset 0x45c00 len 0x45178

image 0x5ff54a00: bdev 0x5ff55380 type dtre offset 0x8b200 len 0x11a78

image 0x5ff54a80: bdev 0x5ff55380 type logo offset 0x9d800 len 0x1a78

image 0x5ff54b00: bdev 0x5ff55380 type bat0 offset 0x9f600 len 0xaa38

image 0x5ff54b80: bdev 0x5ff55380 type bat1 offset 0xaa400 len 0x7f8

image 0x5ff54c00: bdev 0x5ff55380 type glyC offset 0xab000 len 0x1478

image 0x5ff54c80: bdev 0x5ff55380 type chg0 offset 0xace00 len 0x25f8

image 0x5ff54d00: bdev 0x5ff55380 type chg1 offset 0xaf800 len 0x88b8

image 0x5ff54d80: bdev 0x5ff55380 type glyP offset 0xb8200 len 0x2e38

image 0x5ff54e00: bdev 0x5ff55380 type batF offset 0xbb200 len 0x14838

image 0x5ff54e80: bdev 0x5ff55380 type recm offset 0xcfc00 len 0x10f38

image 0x5ff54f00: bdev 0x5ff55380 type log6 offset 0xe1000 len 0x32f8

image 0x5ff54f80: bdev 0x5ff55380 type rec6 offset 0xe4c00 len 0x1e5f8

pinot_init()

mipi_dsim_init()

pinot_init(): pinot_panel_id:      0xa19705c8

pinot_init(): pinot_default_color: 0x00000000

pinot_init(): pinot_backlight_cal: 0x00000000

paint_install_gamma_table: Found Gamma table 0x00970548 / 0x00ffff7f

[NAND] h2fmiPrintConfig:544 Chip ID 98 EE 95 32 7A 55 on FMI0:CE0

[NAND] h2fmiPrintConfig:544 Chip ID 98 EE 95 32 7A 55 on FMI0:CE1

[NAND] h2fmiPrintConfig:544 Chip ID 98 EE 95 32 7A 55 on FMI1:CE8

[NAND] h2fmiPrintConfig:544 Chip ID 98 EE 95 32 7A 55 on FMI1:CE9

 

 

=======================================

::

:: iBoot for n90ap, Copyright 2012, Apple Inc.

::

:: BUILD_TAG: iBoot-1537.9.55

::

:: BUILD_STYLE: RELEASE

::

:: USB_SERIAL_NUMBER: CPID:8930 CPRV:20 CPFM:03 SCEP:02 BDID:00 ECID:XXXXXXXXXXXXXXXX IBFL:03 SRNM:[XXXXXXXXXXX]

::

=======================================

 

[FTL:MSG] Apple NAND Driver (AND) RO

[NAND] h2fmiPrintConfig:544 Chip ID 98 EE 95 32 7A 55 on FMI0:CE0

[NAND] h2fmiPrintConfig:544 Chip ID 98 EE 95 32 7A 55 on FMI0:CE1

[NAND] h2fmiPrintConfig:544 Chip ID 98 EE 95 32 7A 55 on FMI1:CE8

[NAND] h2fmiPrintConfig:544 Chip ID 98 EE 95 32 7A 55 on FMI1:CE9

[FTL:MSG] FIL_Init            [OK]

[FTL:MSG] BUF_Init            [OK]

[FTL:MSG] FPart Init          [OK]

read new style signature 0x43313131 (line:389)

[FTL:MSG] VSVFL Register  [OK]

[WMR:MSG] Metadata whitening is set in NAND signature

[FTL:MSG] VFL Init            [OK]

[FTL:MSG] VFL_Open            [OK]

[FTL:MSG] YAFTL Register  [OK]

[FTL:MSG] FTL_Open            [OK]

Boot Failure Count: 0 Panic Fail Count: 0

Delaying boot for 0 seconds. Hit enter to break into the command prompt...

HFSInitPartition: 0x5ffb6280

Loading kernel cache at 0x44000000

Uncompressed kernel cache at 0x44000000

gBootArgs.commandLine = [cs_enforcement_disable=1 amfi_get_out_of_my_way=1 -v ]

 

iOS 8.4.1のuntethered jailbreakを作成。(別アプローチ)

iOS 8.4.1の(untethered) JailbreakはtihmstarによるEtason JBがありますね。

今回は違う方法を用いてuntethered jailbreakを作成してみましたので記事にまとめておきたいと思います。

 

iOS 8.4.1

iOS 8.4.1は、2015年公開のiOS 8の最終バージョンです。TaiGで使用されたexploitが修正されたため、長い間脱獄できませんでした。このバージョンの脱獄可能になるのはiOS 9.3.5で修正されたPegasusと呼ばれるexploitが公開されてからになります。

iOS 8.4.1はiPhone 5c以外のA5-A6デバイスではiOS 6.0-7.0.6からのOTA updateのためにまだAppleにより署名されているため、誰でも手にすることができる環境となります。要するに、これらのデバイスで条件なしにuntethered jailbreakを手にすることができる最終バージョンです。

 

iOS 8は5年前の古いファームウェアです。普段使いには危ないので最新バージョンにアップデートしてください。この記事はかつてはるか昔に存在した脆弱性を見てみようというものなので、不正利用等を助長するものではありません。

 

脱獄する

今回のuntethered jailbreakは3つの部品により成り立ちます。

一つはカーネルエクスプロイト。最重要ですね。

もう一つはコード署名を回避する方法

最後はデバイスのサンドボックス外にアクセスして任意のコードを実行する方法です。

 

Etason JBでは、カーネルエクスプロイトはCVE-2016-4655, CVE-2016-4656の2つ、コード署名はAppleにより署名されているjscによりCVE-2016-4657をトリガーして回避。最後はAppleの開発者用署名を悪用し、PegasusでJailbreakすることで達成されます。

 

今回は、カーネルエクスプロイトは同じですが残り2つを別のアプローチで行いました。

 

Exploit

exploitは、benjamin氏により公開されているTridentを使用することができます。

CVE-2016-4655のkernel information leakによりKASLRを破り、CVE-2016-4656でカーネル権限を取得してカーネルにパッチを当てて脱獄します。

脱獄したあとは、/Library/LaunchDeamonsにあるデーモンをロードし、substrateをInjectします。

*Kernel Patch

f:id:diosra2:20200131163620p:plain

*proc_enforce: 0に書き換え

*cs_enforcement_disable_amfi: 1をセット

*PE_i_can_has_debugger: 1をセット

*vm_map_enter: NOP, CMP R0, R0

*vm_map_protect: BICNE.WをNOP out

*mount_common: rootfsのマウント制限を回避

*mapForIO: WriteProtectを回避

*substrate: ITTT NEをNOP out

*sandbox call i_can_has_debugger: BLをNOP out

*sb_evaluate: payloadを空き領域に書き込みsb_evaluateをhook

 

Codesignature

コード署名の回避にはPangu9で使用されたdyldの脆弱性を使用します。

The iPhone Wikiより: dyld exploit in dyld shared cache handling to override MISValidateSignature in libmis.dylib for persistency (CVE-2015-7079)

このバグはこちらでPangu Teamのスライドにより解説されています。

https://blog.pangu.io/wp-content/uploads/us-16-Pangu9-Internals.pdf

要するに、偽のヘッダーでdyld shared cacheのmappingを制御可能なので、これを使用してlibmis.dylib内の"_MISValidateSignature"を0で返すようにしてやれば、コード署名検証が常に成功することになります。

 

r-- / rw-メモリは操作できます。libmis.dylib内のexport tabelを変更し、_MISValidateSignatureがreturn 0で返すようにします。32-bitの場合、movs r0, 0; bx lrとなるアドレスを探し、_MISValidateSignatureのポイントをここに変更します。

コード署名は常に成功するようになりました。

 

dyld shared cache

jtoolを使用することでheaderを見ることができます。

Original

 

これを、偽のヘッダーと先ほどの変更を適用させるために、このように変更します。

先ほどの変更がマップされ、コード署名は常に0を返すようになります。これで未署名のexploitを実行できます。

 

untether

untethered jailbreakのためのパーツは整いました。あとはこれを起動時に実行させるだけです。

まず、Tridentのバイナリ(untether)を以下のentitlementを含むようにldidで署名します。

そして、デバイス内を操作してuntetherを設置します。

 

デバイスに書き込む

書き込む方法はいくつかあります。一番簡単なのはcheckm8を使用してSSH ramdiskを送り込んでデバイス内を操作することかなと思います。Xcodeを使用してAppベースでインストールさせても良し、yaluの手法を借りてきても良し、CFWで復元しても良いです。(当時利用できたものだとyaluの手法に限りますね。)

デバイスをDFU modeにしてcehckm8を実行し、pwned DFU modeとなったデバイスにramdiskを送り込んでtethered Bootを行います。このramdiskにはsshを含めておくことで、デバイス内を自由に操作可能となります。/dev/disk0s1s1を/mnt1にマウントし以下の操作をします。

*untether

dyld_shared_cacheを改変したものに置き換える。

Tridentをバイナリ(untether)を/mnt1/trident8に設置する。

"/mnt1/System/Library/LaunchDaemons" 内のplistを、以下のものを除いて全て"/mnt1//Library/LaunchDaemons"に移動する。

*除外リスト

bootps.plist

com.apple.CrashHousekeeping.plist

com.apple.jetsamproperties.XX.plist

com.apple.mDNSResponder.plist

com.apple.MobileFileIntegrity.plist

"/mnt1/usr/libexec/CrashHousekeeping"を"/mnt1/usr/libexec/CrashHousekeeping_"にリネームする

/mnt1/usr/libexec/CrashHousekeepingを"/trident8"のsymlinkに変える

 

*Jailbreak

Cydiaをインストールする。

/mnt1/etc/fstabを操作し、データパーティションからnosuid,nodevを削除する。

 

再起動すると、untethered jailbreakになります。

 

SHSHなしでiOSダウングレードを行うツール 2020年版

SHSHなしでiOSのダウングレードを行うツール(簡易)

使えるツールをただ列挙していきます。ただし古いので最新環境で動かなかったりするかもしれません。OS Xの10.10とmacOS 10.13があればだいたい使えます。windowsは7推奨です。10では動かない可能性があります。

ここに列挙するのは3GS以降の32-bitデバイス用のみです。古いです。もう一度言います、32-bitデバイスのみです。

最近のお高いデバイスでは出来ません。

 

紐なしダウングレードを行うツール

電源ポチで起動できるいわゆる普通に使えるやつです。

これはデバイスに対しローレベルな段階で脆弱性を突いてexploitを適用させるので、当然デバイスは通常よりも脆弱になります。しかし、32-bitデバイスは上位互換の脆弱性が存在するので細かいことは大丈夫です。内からでも外からでも、掛かってる鍵を誰もが解除できるような家に住んでるようなものです。

条件があるやつは赤字です。

 

iPhone 3GS

sn0wbreeze (winのみ)

version: 3.1.3 ~ 6.1.6

ベースバンドアップデート保持モードなら脱獄されない。(winのみ)

 

redsn0w (win/mac)

version: 4.3.3, 5.0 ~ 6.0

*CFW作成機能は4.3.3-5.1.1のみ。

 

pwnagetool (macのみ)

version: 3.1 ~ 5.1.1

*脱獄されます。

 

New Bootrom: ipwndfu (macのみ)

 

3GSにはBootromが2つあります。古いやつはipwndfuは不要ですが、新しいやつは追加でipwndfuでalloc8を適用しないとダメです。

iPhoneOS 3.0にしたい人は作ったのでこれを使ってください。(古いROM限定です。)

 

iPhone 4

ch3rryflower [UNTETHERED]

version: 4.3, 4.3.3, 4.3.5 ~ 7.1.2

作りました。mac/linuxで動きます。

よく読んでから使ってください。

 

iPhone 4以外のA4

なし

 

iPhone 5/5c

ch3rryflower [UNTETHERED]

version: 6.0 - 9.3.5 (理論) *使用可能なデバイスに条件あり

作りました。macで動きます。

実際の対応バージョンはREADMEに書いてあります。よく読んでから使ってください。

iOS 7.x (iPhone 5), iOS 7.1.x (iPhone 5c)のSHSHが必要です。

 

iPhone 5/5c以外のA5/A6

なし

 

紐つきダウングレードを行うツール

電源ポチで起動しない、再起動ごとにパソコンを使用しなければ起動すら出来ない、常用しようとしているならやめましょう。それはゴミです。家で使う分、開発用(にしては古すぎるが...)には良いでしょう。

 

iPhone 3GS, iPhone 4

紐付きが完全上位互換なので不要です。macやlinux環境がない場合はこちらを。

iSuns9/Sund0wn

 

A5デバイス

checkm8の対応がまだなのでありません。

 

A6デバイス

synackuk/n1ghtshade

n1ghtshadeはiOS 6や7にSHSHなしでダウングレードしたり脱獄できます。macのみです。

 

また、私の産物も利用できます。こちらはiOS 8や9を利用したい場合にどうぞ。

iPhone 5/5cのみ: ch3rryflower [TETHERED]

 

こちらもmacのみです。

(基本的に、この手のものを使いたい場合はmacがあった方が良いです。)

Improved iOS 10 kernel patch for 32-bit devices

kernel_version

Darwin Kernel Version 16.3.0: Thu Dec 15 22:41:46 PST 2016; root:xnu-3789.42.2~1/RELEASE_ARM_S5L8950X

 

_mac_mount patch

Improvement: Fixed rootfs cannot be mounted read-only after patched by CBPatcher.

*before_patch (by CBPatcher)

...

80104fee         mov        r2, r1

80104ff0         ldrb.w     r0, [r0, #0x39]

80104ff4         tst.w      r0, #0x40

80104ff8         beq        loc_8010500e

80104ffa         tst.w      fp, #0x1

80104ffe         bne        loc_8010500a         -> b    loc_8010500a

...

8010500a         orr        fp, fp, #0x10000

...

 

*after_patch (using h3lix ..?)

...

80104fee         mov        r2, r1

80104ff0         ldrb.w     r0, [r0, #0x39]      -> //nop

80104ff2                                         -> //nop

80104ff4         tst.w      r0, #0x40            -> //nop

80104ff6                                         -> //nop

80104ff8         beq        loc_8010500e         -> b    loc_8010500e

...

8010500e         add.w      r3, r6, #0x128

...

 

_mapForIO lock patch

Patch based on FrideAppleTeam slides

PE_i_can_has_kernel_configuration

*original

int _PE_i_can_has_kernel_configuration() {

    ...

}

*patched

int _PE_i_can_has_kernel_configuration() {

    return 1;

}

 

isWriteProtected

*original

...

80cd1df4         bne        loc_80cd1e06

 

80cd1df6         ldr.w      r0, [fp, #0x104]

80cd1dfa         ldrb.w     r0, [r0, #0x20]

80cd1dfe         cbz        r0, loc_80cd1e06

 

             loc_80cd1e00:

80cd1e00         ldr        r0, [sp, #0x44 + var_28]

...

*patched

...

80cd1df4         bne        loc_80cd1e06

 

80cd1df6         nop

80cd1df8         nop

80cd1dfa         nop

80cd1dfc         movs       r0, #0x0

80cd1dfe         cbz        r0, loc_80cd1e06

 

             loc_80cd1e00:

80cd1e00         ldr        r0, [sp, #0x44 + var_28]

...

 

Psedo-Code (by Hopper Disassembler v4)

*original

f:id:diosra2:20191226021155p:plain

*patched

f:id:diosra2:20191226021214p:plain

 

iPhone 5をiOS 9.0にSHSHなしでダウングレードする手順(紐付き)

実際にこれを使った時の参考例です。iOS 9.0へ復元して起動します。

 

*緑が実際に入力するコマンドです (赤はログ)

 

ch3rryflower内のTETHERED_for_i5へ移動

bash-3.2$ cd ~/Desktop/ch3rryflower_v1.3b3/macos/TETHERED_for_i5

 

iPhone5,2_9.0_13A344_Restore.ipsw (iOS 9.0のFW)をフォルダ内に設置、以下のコマンド実行

bash-3.2$ ./cherry iPhone5,2_9.0_13A344_Restore.ipsw custom.ipsw -bbupdate -memory -tethered

 

 

復元過程

fake SHSH(偽のSHSH)を取得

bash-3.2$ ./fakeshsh.sh

 

デバイスをDFU Modeで接続

bash-3.2$ ./idevicerestore -t iPhone5,2_fake.ipsw

... 

Received SHSH blobs

SHSH saved to 'shsh/FFFFFFFFFFFF-iPhone5,2-10.3.4.shsh'

bash-3.2$ mv -v shsh/FFFFFFFFFFFF-iPhone5,2-10.3.4.shsh shsh/FFFFFFFFFFFF-iPhone5,2-9.0-13A344.shsh

shsh/FFFFFFFFFFFF-iPhone5,2-10.3.4.shsh -> shsh/FFFFFFFFFFFF-iPhone5,2-9.0-13A344.shsh

 

ここから、CFWで復元する工程です。

pwnediBSSを抽出

bash-3.2$ unzip -j custom.ipsw Firmware/dfu/iBSS*

Archive:  custom.ipsw

  inflating: iBSS.n42.RELEASE.dfu    

bash-3.2$ bin/xpwntool iBSS.n42.RELEASE.dfu softdfu

bash-3.2$ rm iBSS.n42.RELEASE.dfu

 

デバイスをDFU Modeで接続

bash-3.2$ ./checkm8 -p

*** based on checkm8 exploit by axi0mX

**  pwned dfu based on belladonna by synackuk

**  improved by dora2_yururi

Grooming heap

preparing for overwrite

overwriting task struct

uploading payload

executing payload

device is now in pwned DFU mode

bash-3.2$ ./checkm8 -f softdfu

uploading soft DFU

executing soft DFU 

 

idevicererestoreで復元

bash-3.2$ ./idevicererestore -r custom.ipsw

 

起動準備 - Bootloaderの準備(1度だけ行えばよい)

起動するiOSのBuildナンバーでフォルダを作って、そこに格納しておくと便利です。

bash-3.2$ mkdir 13A344

 

iOS 9.0のFWからbootloaderを取り出す

bash-3.2$ unzip -j iPhone5,2_9.0_13A344_Restore.ipsw 058-03706-363.dmg -d 13A344

bash-3.2$ unzip -j iPhone5,2_9.0_13A344_Restore.ipsw Firmware/all_flash/all_flash.n42ap.production/DeviceTree.n42ap.img3 -d 13A344

bash-3.2$ unzip -j iPhone5,2_9.0_13A344_Restore.ipsw Firmware/dfu/iBEC.n42.RELEASE.dfu -d 13A344

bash-3.2$ unzip -j iPhone5,2_9.0_13A344_Restore.ipsw Firmware/dfu/iBSS.n42.RELEASE.dfu -d 13A344

bash-3.2$ unzip -j iPhone5,2_9.0_13A344_Restore.ipsw kernelcache.release.n42 -d 13A344

 

iBSS/iBECのdecrypt

FW Keyはこちら: Monarch 13A344 (iPhone5,2) - The iPhone Wiki

bash-3.2$ bin/xpwntool 13A344/iBSS.n42.RELEASE.dfu 13A344/iBSS.n42.RELEASE.dec -iv f47771607eb9761ee4d62bfde4853afd -k a28a482dedea0079f79b19c0b77b8eca2f64371fed61bdd726dc6c5af6560758

bash-3.2$ bin/xpwntool 13A344/iBEC.n42.RELEASE.dfu 13A344/iBEC.n42.RELEASE.dec -iv 437404a5b4165e635187a4e4b73a148b -k 85cb205cd551442e629ffb267708c5eafe5642c845d46becf7dc5ef5f6244ca4

 

iBSSにrsaパッチ

bash-3.2$ bin/iBoot32Patcher 13A344/iBSS.n42.RELEASE.dec 13A344/pwnediBSS --rsa

main: Starting...

main: iBoot-2817 inputted.

patch_rsa_check: Entering...

find_bl_verify_shsh_generic: Entering...

find_bl_verify_shsh_generic: Found LDR instruction at 0x634e

find_bl_verify_shsh_generic: Found BL verify_shsh at 0x667a

find_bl_verify_shsh_generic: Leaving...

patch_rsa_check: Patching BL verify_shsh at 0x667a...

patch_rsa_check: Leaving...

main: Writing out patched file to 13A344/pwnediBSS...

main: Quitting...

 

iBECにrsa, boot-argsをパッチ

(-b引数のあとに"-v"を渡すことでverbose bootで起動します。(boot-args))

bash-3.2$ bin/iBoot32Patcher 13A344/iBEC.n42.RELEASE.dec 13A344/pwnediBEC.dec --rsa -b "-v"

main: Starting...

main: iBoot-2817 inputted.

patch_boot_args: Entering...

patch_boot_args: Default boot-args string is at 0x3e1ac

patch_boot_args: boot-args xref is at 0x1a43c

patch_boot_args: Applying custom boot-args "-v"

patch_boot_args: Found LDR R1, =boot_args at 0x1a1ca

patch_boot_args: Found CMP R0, #0 at 0x1a1e8

patch_boot_args: Found IT EQ/IT NE at 0x1a1ea

patch_boot_args: Found MOV R6, R1 at 0x1a1ec

patch_boot_args: Found LDR R6, =null_str at 0x1a1e6

patch_boot_args: Pointing LDR R6, =null_str to boot-args xref...

patch_boot_args: Leaving...

patch_rsa_check: Entering...

find_bl_verify_shsh_generic: Entering...

find_bl_verify_shsh_generic: Found LDR instruction at 0x17fc2

find_bl_verify_shsh_generic: Found BL verify_shsh at 0x186f4

find_bl_verify_shsh_generic: Leaving...

patch_rsa_check: Patching BL verify_shsh at 0x186f4...

patch_rsa_check: Leaving...

main: Writing out patched file to 13A344/pwnediBEC.dec...

main: Quitting...

 

iBECのみimg3ファイルに戻す

bash-3.2$ bin/xpwntool 13A344/pwnediBEC.dec 13A344/pwnediBEC -t 13A344/iBEC.n42.RELEASE.dfu

 

不要なファイル削除

bash-3.2$ rm 13A344/iBEC.n42.RELEASE.dec

bash-3.2$ rm 13A344/iBSS.n42.RELEASE.dec

bash-3.2$ rm 13A344/pwnediBEC.dec

 

準備は終わりです。

 

起動 (Tethered)

デバイスをDFU Modeで接続

bash-3.2$ ./checkm8 -p

*** based on checkm8 exploit by axi0mX

**  pwned dfu based on belladonna by synackuk

**  improved by dora2_yururi

Grooming heap

preparing for overwrite

overwriting task struct

uploading payload

executing payload

device is now in pwned DFU mode

 

pwnediBSSを送信

bash-3.2$ ./checkm8 -f 13A344/pwnediBSS

uploading soft DFU

executing soft DFU

 

pwnediBECを送信

bash-3.2$ ./irecovery -f 13A344/pwnediBEC

[==================================================] 100.0%

 

数秒待ってください。

 

./irecovery -qでデバイスがRecovery modeになっているかを確認します。

MODEがRecoveryで、デバイスが真っ黒の状態ならOKです。

bash-3.2$ ./irecovery -q

CPID: 8950

CPRV: 20

BDID: 02

ECID: FFFFFFFFFFFF

CPFM: 03

SCEP: 10

IBFL: 1a

SRNM: FFFFFFFFFFFF

IMEI: N/A

NONC: da2ca29a17a18a87334c37b91318acd27f567d0d

SNON: N/A

MODE: Recovery

 

最後にリカバリーモードから起動(Just Boot)します。

bash-3.2$ ./irecovery -f 13A344/DeviceTree.n42ap.img3

[==================================================] 100.0%

bash-3.2$ ./irecovery -c devicetree

bash-3.2$ ./irecovery -f 13A344/058-03706-363.dmg

[==================================================] 100.0%

bash-3.2$ ./irecovery -c ramdisk

bash-3.2$ ./irecovery -f 13A344/kernelcache.release.n42

[==================================================] 100.0%

bash-3.2$ ./irecovery -c bootx

 

verbose modeで起動したら成功です。この作業は再起動するたびに必要です。


Copyright (C) 2017-2018 Diosra2. All Rights Reserved.