iOS 越狱史及技术简析 - iPhone OS (iOS 1)

本文是对自己这么多年以来对 iPhone 越狱学习的一个总结。

总是谈越狱越狱,结果自己连基本核心都没有搞太懂,于是就想从技术角度回顾一下越狱这么多年都做了些什么,也希望能帮到有相同兴趣的人。

因为我从 iPhone 3G 才开始使用 iPhone,故之前的资料只能从网上摘取,如果有相关错误,敬请指出。

iPhone OS (iOS 1.0) - 2007 年 10 月

当时, iOS 还被叫做 iPhone OS ,预装在 iPhone 第一代里面。没有 App Store,只有一些基础应用,当然,也没有办法安装新的应用。

苹果一开始的想法是用户只需要使用 Safari 访问 HTML5 应用就够了,所以他们并没有提供 iPhone SDK。这个阶段越狱团队的工作一方面是逆向 iPhone 自带的应用程序,搞清楚 iPhone 原生应用程序是如何工作的,然后提供一套工具链用于开发自制的第三方应用[^1](事实证明,后来苹果发布的 SDK 就是这套东西),一方面是取得系统 root 权限,然后安装自制铃声和应用程序。

一个远古第三方自制程序是这样写的

#import <CoreFoundation/CoreFoundation.h>
#import <Foundation/Foundation.h>
#import <UIKit/UITableColumn.h>
#import <UIKit/UISwitchControl.h>
#import <UIKit/UIAlertSheet.h>
...
void progressCallback(unsigned int progress, unsigned int total, char* formatString, void* application) {
    UpgradeApplication* myApp = (UpgradeApplication*) application;
    [myApp doProgress:progress withTotal: total withFormat: formatString];
}
...
@implementation UpgradeApplication

- (void) applicationDidFinishLaunching: (id) unused
{
    UIWindow *window;
    UIView *mainView;
    struct CGRect rect;
    ...
}

[^1]: iPhone Open Application Development, 2nd Edition by Jonathan Zdziarski

这个时候的 iPhone 的安全机制如下:

  • 安全引导链(每个引导环节,都会由上一个引导环节检查签名,但bootrom此时不会检查LLB的签名)
  • fsboot 默认只读
  • AFC 默认只能访问并读写 /Media(即/var/root/Media)[^2]
  • lockdownd 激活锁,防止第三方运营商 SIM 卡使用 iPhone

所有应用程序都放在/Application下,并默认以root权限执行,没有代码签名,甚至刷机不会校验 SHSH(iPhone 一代),这意味着你可以随便降级,所以在这个阶段,越狱实际上是非常简单的。

iBoot cp-command

iOS 版本: iOS 1.0 - iOS 1.0.2

利用软件: iBrickr (Windows) / AppTapp Installer (Mac OS X)

严格意义上来说,这并不算一个漏洞,而更像是一个 feature。起因是 Apple 并没有删除恢复模式中的很多命令,比如cp

流程大致如下:

  • 让设备进入恢复模式,从固件中找出 Restore Ramdisk 和 kernelcache,然后上传到设备上。
  • 创建两个文件 /var/root/Media/fstab/var/root/Media/Services.plist,后者会创建一个新的服务com.apple.afc2,允许通过AFC访问所有文件目录。
  • /dev/disk0s1 挂载到 /mnt1,用户数据/dev/disk0s2挂载到/mnt2,然后把我们上一步创建的两个文件用cp分别替换掉/mnt1/etc/fstab/mnt1/System/Library/Lockdown/Services.plist
  • iBrickr 还会安装 PXLDaemon 守护进程,这个守护进程可以与电脑端 iBrickr 通信,安装第三方软件包,替换铃声等等。而 AppTapp Install 则会安装 Installer.app,其功能与前者大致相同。
  • 重启完成越狱。

[^2]: 这里的/Media指的是/root/Media而并非我们熟知的/var/mobile/Media,因为mobile用户在iOS 1.0-1.1.2中暂时还不存在,下同。

修复:

  • 在 iOS 1.1.2 后更新 iBoot,删除了cp以及其他一些命令。

libtiff-exploit (CVE-2006-3459)

iOS 版本: iOS 1.0 - iOS 1.1.1

利用软件: AppSnapp / JailbreakMe 1.0

核心原理是经典的 buffer overflow — libtiff 在处理 tiff 文件的时候会发生 buffer overflow,允许任意代码执行,只需要让用户访问一个含有tiff图片的网站就可以完成越狱。

碰巧的是,当年 PSP 也饱受 tiff 漏洞的摧残,这个漏洞应该是从 PSP 的■■中收到了启发。

shellcode 做了一些微小的工作:

  • /var/root/Media重命名为/var/root/oldMedia
  • 创建符号链接/var/root/Media/ -> /
  • 重新挂载/dev/disk0s1为读写
    stack.Add(Node(0, Node::PTR));           // r0 = "/var/root/Media"
    stack.Add(Node(1, Node::PTR));           // r1 = "/var/root/Oldmedia"
    stack.Add(Node(20, Node::BYTES));        // r2,r3,r5,r6,r12
    stack.Add(Node(12, Node::STACK));        // sp    -> offset 12
    stack.Add(ldmia_sp_r4);                  // lr = load r4,r7,pc from sp
    stack.Add(rename);                       // pc = rename(r0, r1)

    ...

    stack.Add(Node(2, Node::PTR));           // r0 = "/"
    stack.Add(Node(0, Node::PTR));           // r1 = "/var/root/Media"
    stack.Add(Node(20, Node::BYTES));        // r2,r3,r5,r6,r12
    stack.Add(Node(12, Node::STACK));        // sp -> offset 12
    stack.Add(ldmia_sp_r0);                  // lr = load from r0..pc from sp
    stack.Add(symlink);                      // pc = symlink(r0, r1)

    stack.Add(Node(3, Node::PTR));           // r0 = "hfs"
    stack.Add(Node(2, Node::PTR));           // r1 = "/"
    stack.Add(Node(0x00050000, Node::VAL));  // r2 = MNT_RELOAD | MNT_UPDATE
    stack.Add(Node(8, Node::STACK));         // r3 = **data
    stack.Add(mount);                        // pc = mount(r0, r1, r2, r3)
    stack.Add(Node(4, Node::PTR));           // data = "/dev/disk0s1"

完整代码可以在这里看到。

修复:

  • 更新 libtiff 库。

mknod-vulnerability

iOS 版本: iOS 1.1.2

利用软件: OktoPrep + touchFree

iOS 1.1.2 版本之后,Apple 修复了 libtiffiBoot cp-command 的漏洞,然而,因为前文所提到的,iPhone 第一代可以随便刷机,所以新版的方法也很简单粗暴:先在 iOS 1.1.1 动手脚,然后升级到 iOS 1.1.2 继续搞事情。

具体来说:

  • 在 iPhone 升级之前,OktoPrep 使用mknod /var/root/Media/disk c 14 1直接在用户盘符创建一个字符设备,这句命令的意思是,为主设备号是14,次设备号是1的设备创建一个在/var/root/Media/disk的字符设备,这等同于/dev/rdisk0s1。(可以使用ls -lR /dev查看主次设备号)
  • 升级系统到 iOS 1.1.2,由于升级系统只更改fsroot,而我们创建的文件在用户数据分区中,所以不受影响。
  • touchFree 检查 /var/root/Media/disk 是否存在,然后创建/var/root/Media/touchFree文件夹,复制必要文件到此文件夹中。
  • /var/root/Media/diskdump为rdisk0s1.dmg,挂载这个dmg文件,修改/etc/fstab
  • com.apple.syslogd.plist里面添加DYLD_INSERT_LIBRARIES:/var/root/Media/touchFree/planetbeing.dylib环境变量键值对(熟悉逆向的朋友们可能已经猜到了,没错,syslogd在下一次执行的时候会首先被注入这个动态库。)
  • 动态库会将touchFree文件夹里的东西复制到/bin,创建 AFC2 服务,运行/var/root/Media/touchFree/run.sh脚本,然后把自己的注入环境变量删掉。
  • 脚本会继续复制Installer.app和ssh服务,然后给Springboard和lockdown打补丁。

其中,Springboard 补丁是因为当时 Springboard 显示的程序是写死在allowedDisplayIcons里的,所以需要给[SBIconModel addItemsToIconList: fromPath: withTags:][SBIconController relayoutIcons]里面打补丁,让Installer.app能显示在主屏幕,而lockdown的补丁主要是绕过iPhone激活锁。

修复:
/dev/rdisk0s1被加上了nodev,所以不能再用mknod创建它的设备文件了。

Ramdisk Hack

iOS 版本: iOS 1.1.3 - 1.1.5

利用软件: ZiPhone & iLiberty

从 iOS 1.1 开始,iPhone 新增了以下安全机制:

  • 新增mobile用户,大部分进程都开始以mobile权限运行。(iOS 1.1.3)
  • 所有固件都被Key 0x837加密了

这意味着即使应用出现了 libtiff 的 userland 漏洞,也不再能一招吃遍天了。

这次出现的漏洞还是在恢复模式中。之前 Apple 把 cp 之类的调试命令删掉了,但是,他们还留了一个boot-args环境变量。我们知道,恢复模式需要挂载一个 Ramdisk,这个 Ramdisk 在一般情况下是需要验证签名的。但如果 Ramdisk 的内存地址超过了0x09C00000,则无论什么情况下都会启动。

这回我们轻车熟路了,以ZiPhone为例:

  • AFC 复制必要文件到/var/mobile/Media
  • 重启进入恢复模式,设置引导环境变量setenv boot-args rd=md0 -s -x pmd0=0x09CC2000.0x0133D000(以单用户模式、安全模式启动)
  • 发送bootx,让 iPhone 从 Ramdisk 启动
  • Ramdisk 首先挂载/dev/disk0s1/dev/disk0s2,然后复制一些必要的文件,同时修改/etc/fstab,开机启动prof.sh
if [ "`/usr/bin/nvram jailbreak 2>/dev/null|/bin/cut -f 2`" == "1" ] ; then
/bin/echo "Starting jailbreak..."
/bin/cp /bin/sh /mnt1/bin/sh
/bin/cp /bin/sync /mnt1/bin/sync
/bin/cp /bin/rm /mnt1/bin/rm
/bin/cp /zib/prof.sh /mnt1/private/etc/profile
/bin/cp /zib/fstab /mnt1/private/etc/fstab
…
fi
  • 重启,prof.sh会完成之后的一系列操作

修复:
boot-args从iOS 2.0开始,在生产环境中不生效。(这一点可以从 iBoot 泄露的源码中看出)

// iBoot/apps/iBoot/main.c
bool
env_blacklist_nvram(const char *name)
{
    static const char * const whitelist[] = {
...
#if DEVELOPMENT_BUILD || DEBUG_BUILD
        "boot-args", // factory needs to set boot-args
#endif
...
        NULL
    }
    ...
}

总结

本文回顾了 iPhone OS 中大部分已经公开并使用的越狱工具与他们的利用方法。

虽然 iPhone OS 离我们已经有一轮年头了,但从上面的做的事情中,我们可以看出,实际上,越狱所做的东西还是没有变化太多。

就以本文所有越狱工具为例,基本上就做这么几件事:

  • 修改 /etc/fstab,挂载系统盘为rw
  • 安装一个软件包管理器(Installer.app),然后安装第三方软件
  • 给系统打补丁(解锁,换壁纸,铃声)

为了做这些事情,我们需要:

  • 修改系统文件
  • 破坏 iOS 引导链

在之后长达 12 年中,围绕着这两件事情,苹果跟安全研究员们展开了斗智斗勇。

参考资料

[1] https://www.peerlyst.com/posts/ios-jailbreaks-history-part-1-ivan-ponurovskiy?trk=profile_page_overview_panel_posts

[2] https://www.theiphonewiki.com/

[3] http://blog.iphone-dev.org/

10 Likes

一个小错误:

#if DEVELOPMENT_BUILD || DEBUG_BUILD
        "boot-args", // factory needs to set boot-args
#endif

前排兹磁。

导读:
大纲:
第一年:xx技术,yy技术,zz技术
第二 至 第十二年:同第一年。

楼主我想看第十三年的。:joy:

别急啊…这只是第一章,后面会慢慢写的。

2 Likes

能倒着写吗?

4 Likes

想看后面的十二年

1 Like

请问下后续的文章会更新到哪?是在这个评论区,还是分开

tql
紫薯布丁

牛比啊,太期待了!

有点意思 不错

)1 SOi( SO enohPi - 析简术技及史狱越 SOi

/gro.ved-enohpi.golb//:ptth ]3[

/moc.ikiwenohpieht.www//:sptth ]2[

stsop_lenap_weivrevo_egap_eliforp=krt?yiksvorunop-navi-1-trap-yrotsih-skaerbliaj-soi/stsop/moc.tsylreep.www//:sptth ]1[

料资考参 #

。勇斗智斗了开展们员究研全安跟果苹,情事件两这着绕围,中年 21 达长后之在

链导引 SOi 坏破 -

件文统系改修 -

:要需们我,情事些这做了为

)声铃,纸壁换,锁解(丁补打统系给 -

件软方三第装安后然,)ppa.rellatsnI(器理管包件软个一装安 -

wr为盘统系载挂,batsf/cte/ 改修 -

:事件几么这做就上本基,例为具工狱越有所文本以就

。多太化变有没是还西东的做所狱越,上际实,出看以可们我,中情事的做的面上从但,了头年轮一有经已们我离 SO enohPi 然虽

。法方用利的们他与具工狱越的用使并开公经已分部大中 SO enohPi 了顾回文本

结总 #

```

}

}

LLUN

sgra-toob tes ot sdeen yrotcaf // ,"sgra-toob"

{ = ][tsiletihw tsnoc * rahc tsnoc citats

{

)eman rahc tsnoc(marvn_tsilkcalb_vne*

loob

c.niam/tooBi/sppa/tooBi //

c```

)出看中码源的露泄 tooBi 从以可点一这(。效生不中境环产生在,始开0.2 SOi从sgra-toob

:复修

作操列系一的后之成完会hs.forp,启重 -

```

if

batsf/cte/etavirp/1tnm/ batsf/biz/ pc/nib/

eliforp/cte/etavirp/1tnm/ hs.forp/biz/ pc/nib/

mr/nib/1tnm/ mr/nib/ pc/nib/

cnys/nib/1tnm/ cnys/nib/ pc/nib/

hs/nib/1tnm/ hs/nib/ pc/nib/

"…kaerbliaj gnitratS" ohce/nib/

neht ; ] “1” == “2 f- tuc/nib/|llun/ved/>2 kaerbliaj marvn/nib/rsu/” [ fi

hsab```

hs.forp动启机开,batsf/cte/改修时同,件文的要必些一制复后然,2s0ksid/ved/1s0ksid/ved/载挂先首 ksidmaR -

动启 ksidmaR 从 enohPi 让,xtoob送发 -

)动启式模全安、式模户用单以(000D3310x0.0002CC90x0=0dmp x- s- 0dm=dr sgra-toob vnetes量变境环导引置设,式模复恢入进启重 -

aideM/elibom/rav/到件文要必制复 CFA -

:例为)ppc.enohpiz/1534f88ed81ecafb32b611f269ef7072b18acd7d/bolb/enohPiZ/irbiZ/moc.buhtig//:sptth(]enohPiZ[以,了路熟车轻们我回这

。动启会都下况情么什论无则,00000C90x0了过超址地存内的 ksidmaR 果如但。的名签证验要需是下况情般一在 ksidmaR 个这,ksidmaR 个一载挂要需式模复恢,道知们我。量变境环sgra-toob个一了留还们他,是但,了掉删令命试调的类之 pc 把 elppA 前之。中式模复恢在是还洞漏的现出次这

。了天遍吃招一能再不也,洞漏 dnalresu 的 ffitbil 了现出用应使即着味意这

了密加)738x0_yeK#syeK_SEA/ikiw/moc.ikiwenohpieht.www//:sptth(]738x0 yeK[被都件固有所 -

)3.1.1 SOi(。行运限权elibom以始开都程进分部大,户用elibom增新 -

:制机全安下以了增新 enohPi,始开 1.1 SOi 从

ytrebiLi & )/enohPiZ/irbiZ/moc.buhtig//:sptth(]enohPiZ[ :件软用利

5.1.1 - 3.1.1 SOi :本版 SOi

kcaH ksidmaR ##

。了件文备设的它建创donkm用再能不以所,vedon了上加被1s0ksidr/ved/

:复修

。锁活激enohPi过绕是要主丁补的nwodkcol而,幕屏主在示显能ppa.rellatsnI让,丁补打面里]snocItuoyaler rellortnoCnocIBS[]:sgaThtiw :htaPmorf :tsiLnocIoTsmetIdda ledoMnocIBS[给要需以所,的里snocIyalpsiDdewolla在死写是序程的示显 draobgnirpS 时当为因是丁补 draobgnirpS,中其

。丁补打nwodkcol和draobgnirpS给后然,务服hss和ppa.rellatsnI制复续继会本脚 -

。掉删量变境环入注的己自把后然,本脚hs.nur/eerFhcuot/aideM/toor/rav/行运,务服 2CFA 建创,nib/到制复西东的里夹件文eerFhcuot将会库态动 -

)。库态动个这入注被先首会候时的行执次一下在dgolsys,错没,了到猜经已能可们友朋的向逆悉熟(对值键量变境环bilyd.gniebtenalp/eerFhcuot/aideM/toor/rav/:SEIRARBIL_TRESNI_DLYD加添面里)tsilp.wen.dgolsys.elppa.moc/deriuqer/secruoser/avaj/3834b6fad29635ca936e6d876c10df315603e10f/bolb/eerfhcuot/gniebtenalp/moc.buhtig//:sptth(]tsilp.dgolsys.elppa.moc[往 -

batsf/cte/改修,件文gmd个这载挂,gmd.1s0ksidr为pmudksid/aideM/toor/rav/将 -

。中夹件文此到件文要必制复,夹件文eerFhcuot/aideM/toor/rav/建创后然,在存否是 ksid/aideM/toor/rav/ 查检 eerFhcuot -

。响影受不以所,中区分据数户用在件文的建创们我而,toorsf改更只统系级升于由,2.1.1 SOi 到统系级升 -

)号备设次主看查ved/ Rl- sl用使以可(。1s0ksidr/ved/于同等这,备设符字的ksid/aideM/toor/rav/在个一建创备设的1是号备设次,41是号备设主为,是思意的令命句这,备设符字个一建创符盘户用在接直1 41 c ksid/aideM/toor/rav/ donkm用使 perPotkO,前之级升 enohPi 在 -

:说来体具

。情事搞续继 2.1.1 SOi 到级升后然,脚手动 1.1.1 SOi 在先:暴粗单简很也法方的版新以所,机刷便随以可代一第 enohPi,的到提所文前为因,而然,洞漏的 dnammoc-pc tooBiffitbil 了复修 elppA,后之本版 2.1.1 SOi

)eerfhcuot/gniebtenalp/moc.buhtig//:sptth(]eerFhcuot[ + perPotkO :件软用利

2.1.1 SOi :本版 SOi

ytilibarenluv-donkm ##

。库 ffitbil 新更 -

:复修

。到看)ppc.tiolpxe_ffit/retsam/bolb/0.1-eMkaerbliaJ/kaerbliaJnepO/moc.buhtig//:sptth(]里这[在以可码代整完

```

"1s0ksid/ved/" = atad // ;))RTP::edoN ,4(edoN(ddA.kcats

)3r ,2r ,1r ,0r(tnuom = cp // ;)tnuom(ddA.kcats

atad = 3r // ;))KCATS::edoN ,8(edoN(ddA.kcats**

ETADPU_TNM | DAOLER_TNM = 2r // ;))LAV::edoN ,00005000x0(edoN(ddA.kcats

"/" = 1r // ;))RTP::edoN ,2(edoN(ddA.kcats

"sfh" = 0r // ;))RTP::edoN ,3(edoN(ddA.kcats

)1r ,0r(knilmys = cp // ;)knilmys(ddA.kcats

ps morf cp…0r morf daol = rl // ;)0r_ps_aimdl(ddA.kcats

21 tesffo >- ps // ;))KCATS::edoN ,21(edoN(ddA.kcats

21r,6r,5r,3r,2r // ;))SETYB::edoN ,02(edoN(ddA.kcats

"aideM/toor/rav/" = 1r // ;))RTP::edoN ,0(edoN(ddA.kcats

"/" = 0r // ;))RTP::edoN ,2(edoN(ddA.kcats

)1r ,0r(emaner = cp // ;)emaner(ddA.kcats

ps morf cp,7r,4r daol = rl // ;)4r_ps_aimdl(ddA.kcats

21 tesffo >- ps // ;))KCATS::edoN ,21(edoN(ddA.kcats

21r,6r,5r,3r,2r // ;))SETYB::edoN ,02(edoN(ddA.kcats

"aidemdlO/toor/rav/" = 1r // ;))RTP::edoN ,1(edoN(ddA.kcats

"aideM/toor/rav/" = 0r // ;))RTP::edoN ,0(edoN(ddA.kcats

c```

写读为1s0ksid/ved/载挂新重 -

/ >- /aideM/toor/rav/接链号符建创 -

aideMdlo/toor/rav/为名命重aideM/toor/rav/将 -

:作工的小微些一了做 edocllehs

。发启了到收中解破的 PSP 从是该应洞漏个这,)YpzH-ItJWRW=v?hctaw/moc.ebutuoy.www//:sptth(]残摧[的洞漏 ffit 受饱也 PSP 年当,是的巧碰

。狱越成完以可就站网的片图ffit有含个一问访户用让要需只,行执码代意任许允,wolfrevo reffub 生发会候时的件文 ffit 理处在 ffitbil — wolfrevo reffub 的典经是理原心核

0.1 eMkaerbliaJ / ppanSppA :件软用利

1.1.1 SOi - 0.1 SOi :本版 SOi

)9543-6002-EVC( tiolpxe-ffitbil ##

。令命些一他其及以pc了除删,tooBi 新更后 2.1.1 SOi 在 -

:复修

。同下,在存不还时暂中2.1.1-0.1 SOi在户用elibom为因,aideM/elibom/rav/的知熟们我非并而aideM/toor/是的指aideM/的里这 :]2^[

。狱越成完启重 -

。同相致大者前与能功其,ppa.rellatsnI 装安会则 llatsnI ppaTppA 而。等等声铃换替,包件软方三第装安,信通 rkcirBi 端脑电与以可程进护守个这,程进护守 nomeaDLXP 装安会还 rkcirBi -

tsilp.secivreS/nwodkcoL/yrarbiL/metsyS/1tnm/batsf/cte/1tnm/掉换替别分pc用件文个两的建创步一上们我把后然,2tnm/到载挂2s0ksid/ved/据数户用,1tnm/ 到载挂 1s0ksid/ved/ 将 -

。录目件文有所问访CFA过通许允,2cfa.elppa.moc务服的新个一建创会者后,tsilp.secivreS/aideM/toor/rav/batsf/aideM/toor/rav/ 件文个两建创 -

。上备设到传上后然,ehcaclenrek 和 ksidmaR erotseR 出找中件固从,式模复恢入进备设让 -

:下如致大程流

pc如比,令命多很的中式模复恢除删有没并 elppA 是因起。erutaef 个一是像更而,洞漏个一算不并这,说来上义意格严

)X SO caM( rellatsnI ppaTppA / )swodniW( rkcirBi :件软用利

2.0.1 SOi - 0.1 SOi :本版 SOi

dnammoc-pc tooBi ##

。的单简常非是上际实狱越,段阶个这在以所,级降便随以可你着味意这,)代一 enohPi(HSHS 验校会不机刷至甚,名签码代有没,行执限权toor以认默并,下noitacilppA/在放都序程用应有所

enohPi 用使卡 MIS 商营运方三第止防,锁活激 dnwodkcol -

]2^[)aideM/toor/rav/即(aideM/ 写读并问访能只认默 CFA -

读只认默 toobsf -

)名签的BLL查检会不时此mortoob但,名签查检节环导引个一上由会都,节环导引个每(链导引全安 -

:下如制机全安的 enohPi 的候时个这

iksraizdZ nahtanoJ yb noitidE dn2 ,tnempoleveD noitacilppA nepO enohPi :]1^[

```

}

;tcer tceRGC tcurts

;weiVniam weiVIU*

;wodniw wodniWIU*

{

desunu )di( :gnihcnuaLhsiniFdiDnoitacilppa )diov( -

noitacilppAedargpU noitatnemelpmi@

}

;]gnirtStamrof :tamroFhtiw latot :latoThtiw ssergorp:ssergorPod ppAym[

**;noitacilppa )noitacilppAedargpU( = ppAym noitacilppAedargpU

**{ )noitacilppa diov ,gnirtStamrof rahc ,latot tni dengisnu ,ssergorp tni dengisnu(kcabllaCssergorp diov

>h.teehStrelAIU/tiKIU< tropmi#

>h.lortnoChctiwSIU/tiKIU< tropmi#

>h.nmuloCelbaTIU/tiKIU< tropmi#

>h.noitadnuoF/noitadnuoF< tropmi#

>h.noitadnuoFeroC/noitadnuoFeroC< tropmi#

cjbo```

的写样这是)m.noitacilppAedargpU/secruos/311-ppa.edargpU/b34a2de2f96c87006951b671b5bca8ef3256ba44/bolb/ytinummocenohpi/gniebtenalp/moc.buhtig//:sptth(]序程制自方三第[古远个一 >

。序程用应和声铃制自装安后然,限权 toor 统系得取是面方一,)西东套这是就 KDS 的布发果苹来后,明证实事(]1^[用应方三第的制自发开于用链具工套一供提后然,的作工何如是序程用应生原 enohPi 楚清搞,序程用应的带自 enohPi 向逆是面方一作工的队团狱越段阶个这。KDS enohPi 供提有没并们他以所,了够就用应 5LMTH 问访 irafaS 用使要需只户用是法想的始开一果苹

。用应的新装安法办有没也,然当,用应础基些一有只,erotS ppA 有没。面里代一第 enohPi 在装预, SO enohPi 做叫被还 SOi ,时当

月 01 年 7002 - )0.1 SOi( SO enohPi #

。出指请敬,误错关相有果如,取摘上网从能只料资的前之故,enohPi 用使始开才 G3 enohPi 从我为因

。人的趣兴同相有到帮能望希也,么什些了做都年多么这狱越下一顾回度角术技从想就是于,懂太搞有没都心核本基连己自果结,狱越狱越谈是总

。结总个一的习学狱越 enohPi 对来以年多么这己自对是文本

4 Likes

这是? 行为艺术? 人肉混淆?

1 Like

小伙子 挺皮啊

1 Like

牛逼牛逼 tql

1 Like

这没混淆啊 大佬要我们倒着写 我们就倒着写啊

(-: ¡ǝɯosǝʍɐ

1 Like


因为论坛无法编辑主贴,建了个repo,修正了一些小错误。
过几天发 iOS 2的简析,如果可能的话会半个月更新一次,希望各位看官看得爽的话能在这个仓库给个star。

4 Likes

不能编辑主帖是指?

那个铅笔的编辑按钮不知为何按不动,换safari才能按得动…估计是我插件的问题

1 Like