Küsimus:
GDB probleemid: Obj-C meetodil ei saa murdepunkti seada
SlEePlEs5
2013-11-26 21:15:01 UTC
view on stackexchange narkive permalink

Olen pöördtehnoloogia hakkaja, olen läbi lugenud mõned õpetused ja tean oma põhilisi GDB- ja monteerimiskoode. Pärast paari tühise näite läbivaatamist tahaksin proovida midagi natuke "reaalsemat". Minu eesmärk on ümber kujundada ja „lõhkuda“ introvertsustarkvara / Ambrosia Software'i mäng „Uplink“.

Pange tähele, et teen seda vaid väljakutse nimel, kui tahtsin lihtsalt mängu tasuta mängida leiaks mõra, mitte ei teeks seda. Demo on vabalt saadaval aadressil http://www.ambrosiasw.com/games/uplink/.

Nüüd olen staatilise analüüsi abil õppinud mõned olulised asjad tööriistad Hopper ja class-dump. Peagi selgus, et registreerimisega seotud funktsioonid elasid kaustas ASWRegistration.framework , kuid pärast mõne staatilise analüüsi proovimist otsustasin tulutult visata GDB. Laadis selle üles, proovis seada ühele huvitava välimusega funktsioonile katkestuspunkti.

  (gdb) b + [ASWRegistration isRegistered:] Funktsioon "+ [ASWRegistration isRegistered:]" pole määratletud. Kas muuta tulevase jagatud teegi koormuse jaoks katkestuspunkt? (y või [n]) n  

Ah, see on tüütu. Proovime midagi muud.

  (gdb) b isRegisteredFunction "isRegistered" pole määratletud. Kas muuta jagatud teek tulevase jagamise jaoks ootepunktiks? (y või [n]) n  

Hm, võib-olla teen midagi valesti ...

  (gdb) b isRegistred: sümbolitabelit pole on laaditud. Kasutada käsku "file". Kas muuta jagatud teegi tulevase koormuse jaoks ootepunkt (y või [n]) n (gdb)  

Noh, mis annavad mulle teistsuguse veateate, see siiski ei tööta ...

Edasisel uurimisel , Leidsin, et ma ei suuda käivitatava faili enda funktsioone isegi korralikult rikkuda.

  (gdb) b applicationDidFinishLaunching: [0] tühista [1] kõik ] - [SUStatusChecker applicationDidFinishLaunching:] [3] - [SUUpdater applicationDidFinishLaunching:] > 0tühistatud  

Kaks võimalikku applicationDidFinishLaunching s, mitte üks neist ei pärine tegelikust mängust (ma arvan, et need pärinevad Sparkle.framework-ist). Tundus, nagu oleks Ambrosia nutikas ja eemaldaks kõik silumissümbolid, kuid class-dump annab mulle täielikud päised, nm annab mulle hulga sümboleid ja Hopper leiab igasuguseid meetodeid. Nii et ma ei saa aru, miks GDB seda kasutada ei saa. Olen jällegi selles kõiges algaja, võib-olla teen midagi räiget valet. Proovisin sama asja ka Mac App Store'i mängudega "Hack RUN Free" ja sain sama Sümbolitabelit pole laaditud. Kasutage viga käsk "file" . Loomulikult pole failikäsklusest üldse abi.

Kas keegi teab, kuidas seda parandada? Tahaksin selles puhtalt teoreetilisest tasemest kaugemale jõuda?

Kas olete proovinud `infofunktsioone` kõigi käivitatavate failide funktsioonisümbolite kuvamiseks? Hopperil on sümbolitabeli eraldamiseks teistsugune (tõhusam) meetod. Siin võib see olla GDB piir.
Pange tähele ka seda, et GDB võib katkestada käivitatava faili ükskõik kus. Peate lihtsalt kasutama ühte järgmistest: "b * 0xdeadbeef" või "b * myfunction".
Tõepoolest, GDB ei leia ASWRegistration funktsioonide sümboleid. Kahjuks ei tea ma, kuidas jagatud teegi nihkeid käsitsi arvutada. Kas mõni muu OS X silur, kes seda teeb?
Ja kas leiate selle sümbolit, kui proovite `objdump -x` (vaadake * eksporditabelit *)?
@perror Mitte nii palju kui ma näen. Objdumpi väljund on [siin] (http://pastebin.com/wuaeMS2R), kui olete huvitatud. Ma tean, et sümboleid on võimalik välja mõelda, kuna nii Hopper kui ka IDA demoversioon näivad seda võimaldavat. Olen staatilise analüüsiga jõudnud punkti, kus kuigi olen üsna kindel, et olen õiges kohas, pole minu monteerimisoskus piisavalt hea, et saaksin toimuvat jälgida, kui Hopper ei suuda enam meetodeid leida minule. Käimas on mõned ilmsed _objc_msgSend kõned, kuid ma ei tea, kuidas leida tegelikku koodi, millele need osutavad.
Näib, et binutilid ei leia otsitavat sümbolit. Ja ma nõustun teie hüpoteesiga, tõenäoliselt läksite staatilise analüüsi abil nii kaugele kui võimalik. Kuid võite proovida [radare2] (http://radare.org/y/), selle silur erineb binutilidest, mis võib paremini töötada.
Vaadake lehte [snoop-it] (https://code.google.com/p/snoop-it). Vajab vangistatud iOS-i seadet, kuid sellel on võimas analüüsifunktsioon. [Kasutamise alustamiseks vaadake seda juhendit] (http://resources.infosecinstitute.com/ios-application-security-part-9-analyzing-security-of-ios-applications-using-snoop-it/). See võib aidata teil otsitavaid kõnesid leida.
@Mick snoop-see näeb kena välja, kahjuks on Uplink OS X mäng, snoop-see on mõeldud ainult iOS-ile.
Ma sain valesti aru. [dtrace] (http://et.wikipedia.org/wiki/DTrace) võib pakkuda funktsioonide jälgimist OSX-is ... see võib teid aidata siin: http://stackoverflow.com/a/16242756/12458
Kas olete proovinud gdb asemel lldb-d? lldb-l on käituskeskkonna kohta mõnikord teavet, mida gdb-l pole.
Mul on @microtherion, ei mäleta, et oleksin sellega palju edu saavutanud. Ma teen siiski häid edusamme, kasutades Hopperi (hämmastav tööriist!) Ja gdb kombinatsiooni koos break * 0xaddressiga, nihete info jagatud raamatukoguga ja [seda] (http://stackoverflow.com/a/7275049/2091140) mille leidmiseks nimetati Obj-C meetodit. Värskendan ja vastan oma küsimusele, kui pragu on tehtud.
üks vastus:
broadway
2014-04-04 20:46:21 UTC
view on stackexchange narkive permalink

Objective-C töötab natuke erinevalt kui enamik keeli. Jaotises _ObjC on teil valijaid, mida kasutatakse argumentidena obj_msgSend -le (mis tähendab, et peaaegu kõike kasutatakse). Funktsioonide vahel pole otseseid kõnesid. Ma soovitan alustada Cameron Hotchkies slaididega sellel teemal alates REcon 2008-st.

Ma saan sellest aru, et mul oli siin küsimus selles, et ma ei suutnud leida, millist tegelikku koodi kutsuti `obj_msgSend` kõne tulemusena. See oli mõni aeg tagasi, kuid usun, et otse silumise ja `otool -ov` kombinatsioon aitas mul leida seda, mida otsisin.


See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...