2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Suoritettava tiedostomuoto mach-O on binääritiedostomuoto, jota käytetään Applen käyttöjärjestelmissä macOS ja iOS.
Joissakin iOS-suojaustarkistuksissa saattaa olla tarpeen hankkia toiminnon tietty kutsupaikka, mikä voi ohjata käyttäjiä paikantamaan haavoittuvuudet tarkemmin.
Otetaan nyt esimerkkinä NSLog-funktio ja etsitään staattisesti dynaamisen linkin funktion tietty kutsupaikka machossa.
Etsi sovellusmachossa tietty sijainti, jossa NSLog-funktiota kutsutaan.
Koko hakuprosessi on prosessi, jossa jäsennetään macho-tiedostoja ja jäsennetään binaaridataa sopiviksi tietorakenteiksi.
Machossa käytetään useita osia:
String taulukko
Symbolitaulukko
Dynaaminen symbolitaulukko
§64(TEKSTI,tynkä)
§64(TEKSTI,teksti)
Etsi LC_SYMTAB Load Commandsista, voit määrittää merkkijonotaulukon poikkeaman ja koon sekä löytää myös symbolitaulukon siirtymän ja numeron:
Symbolitaulukon poikkeama on 0x18c478
Symbolien lukumäärä on 0x9a2d
Merkkijonotaulukon siirtymä on 0x2273b0
Merkkijonotaulukon koko on 0x108d58
Koska kunkin symbolin datan pituus on 16 tavua, mikä on 0x10,
Symbolitaulukon koko on siis 0x9a2d*0x10 = 0x9A2D0
Symbolitaulukon aloitusosoite on 0x18c478
Pääteosoite on 0x18c478 0x9A2D0 = 0x226748
String Tablen aloitusosoite on 0x2273b0
Pääteosoite on 0x2273b0 0x108d58 = 0x330108
Koska merkkijonon pituus ei ole kiinteä, merkkijonotaulukon jokaisen datan pituus ei ole kiinteä.
Kun luet merkkijonotaulukon tietoja binäärimuodossa, voit käyttää merkkijonon erottimena 'x00'.
Voit ensin lukea merkkijonotaulukon tiedot machossa ja käyttää 'x00' erottimena luodaksesi merkkijonotaulukon.
Käy merkkijonotaulukon läpi ja määritä, onko jokainen tieto yhtä suuri kuin "_NSLog".
_NSLog löytyi osoitteesta 0x23331b, ja konekoodi "5F4E534C6F6700" on "_NSLogn"-merkkijono.
49003 (0xBF6B heksadesimaalilukuna) on nykyisen merkkijonon indeksinumero, joka määritetään alustavasti muodossa strTab_index = 49003.
Indeksinumero 49003 lasketaan merkkijonotaulukon aloitusosoitteesta 0x2273b0, 49003. tavusta,
0x2273b0 49003 = 0x23331B, joka sattuu olemaan _NSLog:n aloitusosoite.
MachOVeessa voit nähdä, että osoite 0x00224988 vastaa _NSLog.
Kuinka löytää vastaavat symbolitaulukkotiedot indeksinumeron 49003 kautta?
Tunnettu vaiheessa 1:
Symbolitaulukon aloitusosoite on 0x18c478,
Symbolitaulukon loppuosoite on 0x226748.
Tässä machossa yksittäisen symbolitaulukon datakoko on 0x10.
Symbolitaulukon 38993. datan neljän ensimmäisen tavun arvo on 0xBF6B, joka on 49003.
Se on sama kuin merkkijonotaulukon _NSLog-merkkijonon indeksinumero, joten nämä tiedot vastaavat "_NSLog":ta:
38993 on symbolitaulukon nykyisten tietojen indeksinumero, alustavasti symTab_index = 38993,
0x18c478 38993 * 0x10 = 0x224988 on täsmälleen nykyisten tietojen osoite.
Epäsuorien symbolien sijainti voidaan määrittää LC_DYSYMTAB-kohdassa Load Commands -kohdassa Macho:
Aloitusosoite: 0x226748, dataa on 794 kappaletta ja kunkin datan koko on 0x4.
Käy läpi jokainen epäsuorien symbolien data. 111. tieto tallentaa 38993.
Joten nämä tiedot vastaavat "_NSLog", aseta dySymTab_index = 111
0x226748 111*0x4 = 0x226904