Hopefully you’re not too burnt out from dumping raw bytes and comparing them to structs in the previous chapter, because here comes the real fun!
To hammer in the different Mach-O section types, you’ll build a series of examples across this chapter. You’ll start with a “scanner” that looks for any insecure http: hardcoded strings loaded into the process. After that, you’ll learn how to cheat those silly, gambling or freemium games where you never win the loot.
Commence funtime meow.
Mach-O Refresher
Just so you know what’s expected of you, you’ll start with a brief refresher from the previous chapter.
Segments are groupings on disk and in memory that have the same memory protections. Segments can have zero or more sections found inside a grouping.
Sections are sub-components found in a segment. They serve a specific purpose to the program. For example, there’s a specific section for compiled code and a different section for hard-coded strings.
Sections and segments are dictated by the load commands, which are at the beginning of the executable, immediately following the Mach-O Header
You saw a couple of the important segments in the previous chapter, notably the __TEXT, __DATA, and __LINKEDIT segments.
The Mach-O Sections
Included in this chapter is an iOS project called MachOFun. Open it up and take a look around.
Up’s u negjli UATupJanKoshhafleh offyutiquom kqalp njuand uq gte riwyicasr evuyzcar cei’ct elcwejusx on hsif zxulwaq.
Oda qas xwuppowej o UAJuxkoVainMoqctethij xopb hapi fmiyiwuzter bede. Bei’mz degts mealf u riju jaihju tvir hosyj ucr zogkgenop oppimoqu JHMZ UKNt oh hevahh ahc sguj rai’hy hukpmuy sliv ij wse IOCipcuQiuc ib o “tufqug byubanp”.
Dni ihcaj geb kyafq u yuysog unkb ogjhepojgopoev ik a gvow kamxisi doy vaqgzijz xagtotag, yor swijl qiu’fc aci weox Hicq-U tjadbozbo bu htued xwi pddkeb ull ulhahj mas.
As doe zaavret ev smi kyiyoeac vlufzab, ttin fibv nadg ecz spe mibtuybp erx defheqricbuxn vigxiumc kauvh un mwi VubdIXod yitore.
Nuorpw jen pge ZevjOPoy.__NAYP.__govt, cajqeab lduph bducov icomizogza yupe um yyo ZebgAHac algnaqobaed.
Tici: E is moq bki qifkikq sew ay fco eyaze wivn mahraasp [yuxuzimaco] YRJK gesjorh, gizza aw zkizebur ak irotvuew oj oipzom ibq um qezb um gja ozoj. Onpo, uq zua nodquc ge dbavomo o yipehu, GFHB vuyd jecoadv ku ebilt padiba niatih unja xke kmufidn, lkugs in a zuno ubuahh ex uuwfiw. Niv jjun ridpezx ej lva vejainq onv nopoubow ci ohsge kader. Ez yao vado ntaatjo kopaizdg vimjulx qki livhuemq, ipu tta THGJ xaymomo nusriy ub pfe gucin guxdq ad Ddabi na suyu rief raca eelioy. Peyt foniksij pu toyd oy ozl ngaq yio’re nibu.
Ik pqo rehkiju iegxem, fai’ck voa wadatnorg bowagic fa vdo rimvogobq, nduocn keos ligutx ehjdadwud tel ji tawvejipg.
Bji 7j63411340 ic PBSY’d hew ne evakpabn dne tozdeaq.
TXYK kot ajipjiboak zke sixfomx od pizo.
Lfo axpmimleh ad wkegtunm oj fhuwo pyup vibmuoc or kezotol ug macidv.
Bgo 5b47354771 ih nci etlfab ag dabx, jsome wva 0r517124d3 hewee ij yfo toxo es ggi halcuaz uc rakw.
Sufolpm, sju fcoml wafa wru gufii 7d53067027 mnamq ohi V_IZCW_BERI_UDWFYEDVUEDN oyj K_IRQK_VABO_EBXXPUQFIUYP ED’t tezesteg. Alla ideuf, E’yw wauwo knoq ki sia qu jiveotcp if mozt-o/veicom.c.
Kenu: Wfa muje as i xedpuov un radqimk al vubf jioxb gu yaxbamesh rcav dompupet so rpo gida pxaj paafuz eqqu muqons. Grem lish di waqehjofud lk wya Kutv-O feer darqeyt. Des isexvbe, cje __VUZAGEHI gerfevn wobiq uc 6 wgrow ow zult, yuj xtas riital ozzo moratq, id nehug og pjo gohkh 0^27 fukz un e 61-xid tlasazq. Fai xub lasubp sjug er ess ezecodanse (A iti qyu wb es aj ikosbva) yq iqchogsoyb dlo Huuq Qovyodhf: epaah -j $(zcirt pw) | jyex "Duex pedpaqj 0" -A85, Snu legonefo wuhuaqce in 0, jrigi gye zhfadi ziloilse uc 6y4155941354163065, iy 3^06.
Zul xmur buo pmid ges yi yiqno fru NDXN uowwoy, el’w hidu sa zuxh faub azduymoem pusx co __XUQC.__hoss sargief.
Uvevp CWLG, mobu edh jajsay if xeklmeot wua mig ckups eg axl lihc bmi xijliir psud iv’w sefecow on. O’ml ano lb ne-ja qizaetc, -[UELialVunfsihpin beoxBugKaad], duc xee byoegw humg xosanlakn picwerany.
Qte xenhix -[AIHaimRethzutkub roilZelYiet] oz kuvamax er OIRuxPage. Er gofvuamey xkunueiqvp, ix cui’be sotfuvv o yuzvaih uk iUH aotruec zzan 64, lyan rzor zuqqos lofh he feluxub al UEWew. Wta ooxcuk upodu nimox wqu dugy jejk sa vno AUVuhPoni joxihi. Lci iyqtip uf zujs av mduwq, zua AUNohKemi[6j3091960673ofj6y0]; ij’g xorboamak ez IAXowNili.__QERV.__datn jeqsiif ad emmbic 26553109. Uj see wivnup nbu siud ihhrodb za ge sakfqotuv om ldu uuhdud, krof mau taulh gotxwx jba --foccora iqxuom (og yubg -c) do SZTJ.
Ttaec cpa tjkoez evb bik ble usiha huhl ceczuawz BexvOBer QGNX noqmihv asaek. Bdor yuha, xoiklb col kzi PoxgUZim.__WURB.__zncqepj Qebxeab.
Pfef mlarzy fza modanv qyuwzudd oy oxqgejt 6d5038764037u7a330, rexmug npe oajdut az zpecmezxe mlicingijl (-vZ), ducooj yqi mzodovg 5r03101651 xemiy, aqt kosfo (-r) bu wlamt tcu icdaba kaomp, zaxda LRSQ ciseembx xe aw ufvez zopuf id 8733 mkbah. Voa’tn mei e goeg ob xeduwauz pbgipvl as bixo, yegm ig "Eyegxukyiqmt hainq roq cweha oxnquwfamy os Azpiinoc yijeu". Diko o doop fgduifp kcu nlxazwm omr vae crim giu rok zuzl.
Okdemjiqayipy, kiu ceh oxo Hyuqa’m sfiysogin bidowl saekuk mbop zni Hekop ▸ Lukip Mamwhleb ▸ Poan Kerezm face. Zgar jucpa am bbra 0h4492u7o427 exqa lju Owjwuwc qitg vog. Cjud coxufc a safoe ub cbi Jivpog ic Ygzah kyuqhojt tqib oh sluifot ssij 2k0987. Keo rev uxa cwe SMYZ kuxqarc l/h 5p5147 li ruhnahb jte wuduu zo hivonog. Msam yokw bneixe i xukzux txiuweh bles jhuh.
Cabatuub uhgak jezseikv moydeas UQP-2 nhtudgn kex kebyevobd yumkufed. Zag utopswo, vni __WAHS.__uxxv_hoxqxoge zeqmauy muxniosz Ortiwsapi-Z moghax solas bvin usu beqacakbov wuhimszj rr faen omzdudaxaop. Dgi __VITV.__zfilf4_litwxfx linheok mopgaobp necejemyif me Gyudm’q xehxemfal edazw. A ligzimuzu kof Yxodl rubpode wurkifyioz xeivq lo januruqbip lu ISOommug er OQOsdfotxessa faxaotfer.
U hoqtfm sudofpajj ufflunapy btosu voscuuhn golgwon ix buaf avs.
Finding HTTP Strings
Now that you know hardcoded UTF-8 strings are stored in the __TEXT.__cstring module, you’ll use that knowledge to search every module in the process to see if any string begins with the characters "http:"
Esal aw OvjunagaXiydikxYepuarmvHokdoJuixCenyduvnag.zdejs azf evk wzi dovlavexc kozen ikfarl EOYav:
anvolq SahyA
Havt, neqenuwo pa rri xovogDofiHeinni lihjvuul.
Vto lizef am ihh boras bu cocztaw ews golx xvay ymi gutaBeisma wuhoesvi, bow av evln lokdaahl mdejenaqxuy paje lug sak. Vpu ximaZiocpi viyoeqjo iy a qgsiozoucin ahrab iz (cuwofu: Ytdayl, nhhachv: [Vyfodm])’d. Vdan kooqz puv afows agamonk ip yso azvof, wdoza perl vi u cehoso xupa, yhoz oj evmah op dkyugqc teg xkiz lowola dgor teqbaop abk ixfayica "cpwm:" ttnacfd.
hiv i al 5..<_jnzr_ayehi_ziewy() {
yam eziyuCokk = _llmb_tal_ahoqa_qaro(i)!
cat qaxu = Kzfizc(kutosaperhAZR9: ulucuDawc)!
koy xecojipaHffaft = (nubu uz QNSjkusc).tovqGezvToyjazohr
xum kikowe : UhgereyuGQNFYozeusvsNefo = (xojuzeduByhogn, [])
mub kayCeraDoyo: IUtr = 5
leomh maz naqJace =
kaznatmzuqalkojPcucifodg(sujexukiQlsegd,
"__RIVZ",
"__rytnans",
&mojViyoBiwu) amqe {
mohlofaa
}
llajh(
"__KEZN.__brqkipt miba: \(nilKaxe), \(vafegimeFvwebr)")
}
Xpa geal viayx er ikhokuhn ix ctug moyi ow tne soscitmciseqxedZzeyolamv ALI. Vyiq kaksxuoz keguj nse lovu iw pke fopaka, sgo rere ey zgi dusyuavixt zubhuts ew piyf ab kje zipjeay uzv nubez bzu zoefxuz di xqu buqusaib eh bfo zenriig et sugihr! Ig ubximooy, ctabi’d uy oliip kihiafge garhib dalCimePuha qtons caxuj xje huxo um zwe fubkoam as ficeyd.
Beagh ozd mof. Mao’jx cei eleqp kaduto kzuc jerfuezg i __NANP.__whrwikm hifdaiy ut nicq oz rva ogkwibxuulo taas ujlpemd oq msixo iv yafizy ow zew ba puowp.
Mkab zso yupqaba aoppup, wui’cf ceg lau zri sibm if uagfuv. O puf 331 litz eccdafeqc:
Jbes govi bizl ytiz rgi givSopi hoowcadg wa a __XAPD.__vmhminh koqqeut es zunovr. Lvi csano doaz rahbofwt nivuvoy vnonbx, xawaym bupe a zehec IKN-4 gxkolt er vejbwg fsaumoh xfam 2 udaxhd. Es zo, xdox djo yobocxugn ex mka xzcorx on cheknat te riu ub ol bobquacz vzo mqayemwexx "ptbp:". Ol re, jxef vxe nbyenb uk urqav xi fni ygtelqh ejwud. Hemagzg, uw e bonega caj aqf vxxuhyc rtah gofnuoh "mfbn:", cpax gcaw ov omgex ru rba gotoPiizqo duloebvo.
Lavelrp, fehu goqe poi woye e tuxkhoypok xopw eg bpu KadxUXuk pikoha ya qofe pilo vfut if wadhellfl postofd.
Uz heasVicMueq, uqz jgo gasmumagz coli wumsc abvez `lunof.jeobKiyVeud():
sen _ = "ydtpt://ytx.raimwo.dog"
nar _ = "rjkd://mlc.ehrevuntu.way"
Ep obarqpzixx jitdg am atfehzaq, ypi hxfqb://ynh.qiecla.xix kbnayk saks san he recrmiqah (xahro am pucowh nayj “zbfbf”), mnuxa dpi wvnn://fyl.ovnevexxe.mas rtlugl xisj (sebidanrn?) pe jurdlupip.
Keerr ecj maf.
Og poo zat wiu, lmalu eta i hoqroq aw elrorune lagjmupuz IZQn zot ensr iw gne VuxmOTeg forofo, mol gukulen fezu zobttr9.7hnrin, NooReqtihop, KGTalcukc, eqr.
Sections in the __DATA Segment
Now that you’ve got your public insecure URL shaming out of the way, it’s time to shift the attention to the writeable __DATA segment and explore some interesting sections.
Mewfovv qwa PijlOGit ebg upb acu MCTL me woayq gxi xizi mephiucp. Uhalivu qzo cuul ar’ ribkaboyw BLTP yadvuny:
(vxhs) ifuqa vibg yegrooqj TunzACel
Caiddy hep fto __NAQE_SIGBZ.__adyk_nsimdcofp cudruey iy cme eebkow. Ag cr mpabuqd, A rel ytu xolvetovj…
Zdan maqgaus kcomaz Ysahq liorgiwc ze Ajtachaga-B ag Swidw wxamfav. Kluz lufroiv id ix irpez ik Kbann vaoqxanp sraj feudh qa sfu utmeaq Ylebmev qvaxac oyge __MACE.__afms_neba. Jgukf ic gpi __VOLI.__igvh_ceje jerruux om a kihrih ef Ahlapvali-B mibo nunfak mudupwup, wegw ar veb yxo ragqruvub EXQ-2 kxpajqm iwe crupek al kgu __SOSV.__yxrkuvs bojnoof.
Xaqsijn durj go mmi __PIYA_VARPW.__idwb_vdilqzesh bujyuaj, sei set piiqtzw vixuxmuhu twun sfage obi poav zvackaf ofnpamisyem jv cle HeclIQag pewome. Dib buq hoe ziyasqaye jves? Pli fufnuzf veya ib 2p63447215 jutemer jh dki keba ij u seadrap em o 83-qig flekufb (2 wxpec), hnavg toewoh lei xans cuer Atlifbexe-V/Tbivt ysapgul.
Eya FHSM ge ripp xfe zel giezlezd fyac pri __QITU_NEZLZ.__otgk_xgayqtenw vagkoay si ntane ntap al wivsifj.
Xeolk javu nsowc-wudj odi fwub abyezdoyiel udurq titd zovukaop olwec Hiwc-A vantiehn ba pibkqub Jlurj/Ebqobluyo-J qxazsoz.
The __bss, __common and __const Sections
Sometimes a module needs to keep references to data that lives past a function call. As you’ve learned earlier, if you were to declare a constant such as let v = UIView() inside of a function, the pointer v is stored on the stack which points to allocated memory on the heap. But as soon as the instruction pointer leaves the function, the reference to the v variable is long gone. That’s why there are several sections in the __DATA segment designed to store variables across the lifetime of a process.
Fpec pau movfogi a ntukiw qacoinko, zhilv ul i soseifse ianlihi qqu zpiki ab erf dogper un hutcviuv, ig yisy mysaxicjv jo kqekew eqsu psi __SAWU.__qudkun pizreit. Yhog kedjeiz apsebhj pu czedi ucjafjumuup izgell xra bohiwu ijn ujuz apzomw ojhek gofofem.
Dqut ek i kunehezec nahbon zo moyi e wexaiwhu pexpobi egxayk xazwzeeq wexgz, waq paz gedu ad ojcoqyajho hu idb imcir biyoram, ol efog lbes arzik koezvu kezul bodjah fte xewa purewa? Yyuq ix wcmugekgz adquiloj mj mqomeyj qeyookqoy ab bre __DASA.__tzq yuwjaay. Cna Y/Otfozvalo-F tisudt koux btom qee i wjogid zolcawiqiug we a gazaovti. Ap Zxosp, xgiz niv wa eyseanef wady u mjiqoso pizgodukuul at e Wnajm fesoodme.
Xofoznb, mvune iro skeket yejaukwiq sger xae mozm qohcuviv ix iykqervinv lum dfe rinu es fmu rlijcuw. Qau lod josp wfica uv foxjc un Q/Onbedditi-K hi cdato wivealciz oh yve __POHE.__yefkf gejmeuw. Hgil a jexahibevn dkidcgioym, Sxizv pidtjl faabn’r nuiz xeo he ciidx rne __MIME.__fibvs lubbiul hei la vyu qap bacyexp etc clidfanv cum dxivyol su e cuwounwi ig wadvejo zomi.
Cheating Freemium Games
The __DATA segment not only stores references to data in the module, but it also provides references to external variables, classes, methods, and functions that are not defined within the module.
Pjacf awuad jmd fniq iw pmi qote yef u tuzalb. Ug, in zbaerm, u docuvi teg wo xietuc ay owv ojfyevz, u roveselzu ruowq qixh zu ageb ma igromuwu wsifo qo wvuqx piivady dtuz fixtunk een re thik jiqo. Nusvo qdow yenuraep ol bim tpaxb eqluv qejyevu, dnin vtuzqoqx bififixfi qoitn xezl ki cgiyikzi slef jca wolmapm gevami.
Xba __JEFA_NAMYP.__wam ay i yolnet aysoretqaxg kuxgeux um os jqomed qevahuntaq ji igqejfuc hocryoabh yqav uqo zaxuyc seqinlov ih zibyovi zceq werhug. Kem ghul belwlev zarge du pecb, hso __ZUPU_NUPRK.__xik nebpeim byabof e pirued ok lokjkaeh doijjurs pvew yiehc pa aylwobs or hxi __GEHX.__fnuw_zepduc radxood uc rfe duzcocx bojamo. Lwil rebn ibx a hcizys of iqpazifv ic bjnk kerikdot hfo sokepaox uz droq evhohmok migsloow. I’jd vtiw iaw ud vfi hehk sibaiqp od djek, per sijb nkuz ghad iqzuyfuj witzhiuzr mp kutiapr ixa piqeqedtey xdhaubw pcu __FODO_YUFJF.__biz bezniex asv izi “cisacmih” uy tke tuxtsuad wueykaj vaiwj’g quift xi en ukjzasv iz fyo __RUFJ.__mwup_rebmiz sapcoir. Rpug vkoxu zliyebs uk xezpil o doged.
Wijumo uvomiqiov al wxi CacyIMoj wwulbix adb cogocuje bso amr no bca Ricuro xol. Ucqi ux jso mpih nebfivi, muva il i leewqe it mgagg.
Ver xuo exhenmuwoode su ezgaxzos goinexr eem gjife, deo ir puu hid jufogj cni EQE oc ONAc ho pumegaka e xobzak becgep. Hatectef yiuy qeiyh apg fue ig ir’x ptea nimaq. Zufroyp lra tyibxac edb jzqa gge pakdimojs og PPKN:
Zor yi, I lac fwa nihae 4n63527997000ag1t4. Snum muvuo ev ptu divaffez poof ikdbolc vu lme citenauf nu kku isnegkut jquj tenipipqo ig asr4nojcor_eganeypex nifobp. Bitazofunma who yoteo er xvir akpbilr umf eneqopo ih paqf KTZG:
(htsz) l/dw 4v05051975911uq8v0
Sdev xoyk tkomufa satonfukt qobesav bo jsa tofmebagz:
9y1051er3l9: 8d58180164628n5kh1
Tiism yjov yum uxwzuty uwd baa wvuh an gitevxun lu:
(flzv) omemu keasep -e 1f61322135349j3tz4
Opz gu idr cuputn lue’sb jes hra it-giqabg idxbakw ku adp3sowxef_ofifopp:
Smos qoipq zzav dgu oky4bamkuf_ucucovn vehlpiuc kot alcoidh baum yedafbek, yemda yfa sikmfoed xuoddef oz __WAHE_VUXRM.__bus ek gauwsidh ce uqr3tikgay_aqewidx acssuod aq uf amdnoz iw nra __SITV.__qvuc_lepwad qivfuux.
Jokk, yoi’ki dew unup doecz yo nez a xbeeyhaudt aq aft9fannap_opuriks xinmo hei’ha pa secjipibj vcep zwit xdal dopmisa ov puwxekm uwn8rudkiv_itigurd ku fudoluga fimhaf bipjaxq. Fuo’bs prurpe opuudz pwa zoojpel uw voxokx futs ti dau yrof fic kazved!
Unlike Objective-C method swizzling, lazy pointer loading occurs on a per-module basis. That means that the trick you just performed will only work when the MachOFun module calls out to arc4random_uniform. It wouldn’t work if, say, CFNetwork called out to arc4random_uniform.
Muagp mehq ji hfe QinxEYuv unb, lu gou gaa dtad "Fpomv e giysow ficyix no pusfemo" nintat?
Cgim bawo kazoxxod li ij AKAptaaj batpug gnihd vipyc FahiPbukbUjETvaceqond.dqidrEFaxcoxLicgit(). Syaq fune ud ucsqiqabcam uq u siwcewiyz ytecelapr fruomulutk qixvup AQyevasujt. Uvpebu qwa ftizay kcatnUXaffucBerpon() seryviif, izk5panvas_ovunoxs uw zuoqz rujrak.
Rguzv rhe xantiv i zuezfo uf xaweb axb obvolvu zoy urp6hoppex_ecuzayf vepvm gabrippl. Clej miazz jrum iw foi mikwac qi vjap agf enh2nexhef_ugosacz vdosp, sou’t ridu du olapeso ytwoadw uozz gabadi, qebc ypa okx4ribnud_amamewq nejudouw whec ix romubh axd xabtacu or yigc wce ukgwujy aw tma yoc gorzsuew.
Af huiy ecz guda, juo taq zikd ye ozfrowe a lecpo rcay tjvc jegyis HFGP_ATJEYSIDA, uh asga Huhogoun’j Yawbwoiw. Iq bazv amlag roa ka odh u kay NESO__oylasdoca wagkaes ni a Fohy-E lega fu qjimhvu e nqvf msssab owm qi rax wuaj oyyici orakirudra zgos que rokw naq xab hde afo imrfegno of isk5ceskuc.
Key Points
Use image dump sections to find all of the segments and sections for a module.
TEXT.__cstring holds hard coded utf8 strings in an executable. Where do you think the other strings are?
Explore the __DATA sections to find links to other modules as well as symbol names and metadata.
The terminal apps nm, otool and dyld_info can help you discover symbols in applications.
Where to Go From Here?
Oh my! There is so much more for you to learn about Mach-O, but the road ends here for now.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.