παπι Δημοσ. 15 Ιουνίου 2012 Δημοσ. 15 Ιουνίου 2012 Μπορει να μου πει κανεις πως στο πεοντα γινεται να εκτελεστει ενα κομματι κωδικα μεσου buffer overun ????? Βασικα εδω δεν μπορω να καταφερω να "σπασω" ενα ηδη ραου κωδικα και να του χωσω ενα κομματι > void __stdcall addOne(int* i) { ++*i; } __declspec(naked) void __stdcall showMsg(void) { MessageBox(0,0,0,0); } char rawFuncCodeAddOne[] = { 0x55, 0x8b, 0xec, 0x81, 0xec, 0xc0, 0 , 0, 0, 0x53, 0x56, 0x57, 0x8d, 0xbd, 0x40, 0xff, 0xff, 0xff, 0xb9, 0x30, 0, 0, 0, 0xb8, 0xcc, 0xcc, 0xcc, 0xcc, 0xf3, 0xab, 0x8b, 0x45, 0x08, 0x8b, 0x08, 0x83, 0xc1, 0x01, 0x8b, 0x55, 0x08, 0x89, 0x0a, //idx -8 0x5f, 0x5e, 0x8b, 0xe5, 0x5d, 0xc2, 0x04, 0 }; char callMsgBox[] = { //4 push 0 0x6a, 0, 0x6a, 0, 0x6a, 0, 0x6a, 0, //call msgbox 0xff, 0x15, 0x83, 0x6, 0 }; typedef union { void (__stdcall * call)(int*); void* ptr; char* bptr; }funcPtr; int WINAPI WinMain(HINSTANCE,HINSTANCE,char *,int) { funcPtr fp; fp.ptr = VirtualAllocEx(GetCurrentProcess(),0, sizeof(rawFuncCodeAddOne) + sizeof(callMsgBox), MEM_COMMIT,PAGE_EXECUTE_READWRITE); memcpy(fp.ptr,rawFuncCodeAddOne,sizeof(rawFuncCodeAddOne) - 8); memcpy(fp.bptr + sizeof(rawFuncCodeAddOne) - 8, callMsgBox,sizeof(callMsgBox)); memcpy(fp.bptr + sizeof(rawFuncCodeAddOne) - 8 + sizeof(callMsgBox), rawFuncCodeAddOne - 8, 8); int test = 0; fp.call(&test); return 0; }
hawkpilot Δημοσ. 15 Ιουνίου 2012 Δημοσ. 15 Ιουνίου 2012 Μπορει να μου πει κανεις πως στο πεοντα γινεται να εκτελεστει ενα κομματι κωδικα μεσου buffer overun ????? Βασικα εδω δεν μπορω να καταφερω να "σπασω" ενα ηδη ραου κωδικα και να του χωσω ενα κομματι > ... Πρόκειται να την πέσεις σε κανένα site ή εφαρμογή ?
MindControl Δημοσ. 16 Ιουνίου 2012 Δημοσ. 16 Ιουνίου 2012 Papi, Δεν χρειάζεται να σου το πω εγώ, αυτο που θέλεις να κάνεις γνωρίζεις και εσύ ότι δεν είναι ακριβώς και το πιο "ηθικό" πράγμα ! Πιστεύεις λοιπόν ότι θα πάρεις απάντηση ; Εν πάσι περιπτώσει, αν υποθέσουμε ότι είναι για education purposes only, πώς φαντάζεσαι το BO και πώς φαντάζεσαι το Injection, ρωτάω γιατί βλέπω κώδικα C++ me inline ASM, άρα έχεις γνώσει των πραγμάτων ή ρωτάς για να μάθεις στα τυφλά ; MindControl.
παπι Δημοσ. 16 Ιουνίου 2012 Μέλος Δημοσ. 16 Ιουνίου 2012 Σκεφτομαι να χακαρω την ΕΤΕ. (sarcasm) Και βεβαια ειναι για εγκυκλοπαιδικες γνωσεις.
defacer Δημοσ. 17 Ιουνίου 2012 Δημοσ. 17 Ιουνίου 2012 Δεν χρειάζεται να σου το πω εγώ, αυτο που θέλεις να κάνεις γνωρίζεις και εσύ ότι δεν είναι ακριβώς και το πιο "ηθικό" πράγμα ! Θα διαφωνήσω. Αυτό που θέλει να κάνει όσον αφορά το τόπικ είναι ηθικότατο (θέλει να μάθει πράγματα). Υπάρχει περίπτωση αποκτώντας αυτή τη γνώση να τη χρησιμοποιήσει στο μέλλον με ανήθικο τρόπο, αλλά αυτό είναι κάτι τελείως διαφορετικό. Μπορει να μου πει κανεις πως στο πεοντα γινεται να εκτελεστει ενα κομματι κωδικα μεσου buffer overun ????? Υπάρχουν αρκετές διαφορετικές τεχνικές. Η "παραδοσιακή" είναι να κάνεις overwrite την τιμή του EBP register που έχει αποθηκευτεί στο stack frame που βρίσκεσαι, ούτως ώστε μετά την RET η ροή του προγράμματος να μεταφρθεί σε διεύθυνση της επιλογής σου. Αυτό που βλέπω να κάνεις εδώ είναι ότι προσπαθείς να βάλεις "εμβόλιμο" τον κώδικα της callMsgBox μέσα στην rawFuncCodeAddOne. Δε μπορώ να βοηθήσω πολύ αυτή τη στιγμή αλλά μερικά γενικά σχόλια: Αυτό που κάνεις δεν είναι buffer overrun. Ακόμα κι αν πετύχαινε δε βλέπω πώς θα σου χρησιμεύσει, αφού προϋποθέτει ότι ο κώδικάς σου εκτελείται ήδη (για να κάνεις το interpolation). Αν εκτελείται ήδη ο κώδικάς σου τότε κάνε κατευθείαν αυτό που ήθελες . Γιατί μας δίνεις την rawFuncCodeAddOne σε machine code αφού δεν παίζει ρόλο; Δώστην σε source με ένα comment για το πού βάζεις το inject ή τουλάχιστον σε assembly. Τζάμπα παίδεμα. Έχω πολύ καιρό να ασχοληθώ με assembly αλλά το 0xFF 0x15 δε μου φαίνεται για CALL. Είσαι σίγουρος;
παπι Δημοσ. 18 Ιουνίου 2012 Μέλος Δημοσ. 18 Ιουνίου 2012 Θα διαφωνήσω. Αυτό που θέλει να κάνει όσον αφορά το τόπικ είναι ηθικότατο (θέλει να μάθει πράγματα). Υπάρχει περίπτωση αποκτώντας αυτή τη γνώση να τη χρησιμοποιήσει στο μέλλον με ανήθικο τρόπο, αλλά αυτό είναι κάτι τελείως διαφορετικό. Υπάρχουν αρκετές διαφορετικές τεχνικές. Η "παραδοσιακή" είναι να κάνεις overwrite την τιμή του EBP register που έχει αποθηκευτεί στο stack frame που βρίσκεσαι, ούτως ώστε μετά την RET η ροή του προγράμματος να μεταφρθεί σε διεύθυνση της επιλογής σου. Αυτό που βλέπω να κάνεις εδώ είναι ότι προσπαθείς να βάλεις "εμβόλιμο" τον κώδικα της callMsgBox μέσα στην rawFuncCodeAddOne. Δε μπορώ να βοηθήσω πολύ αυτή τη στιγμή αλλά μερικά γενικά σχόλια: Αυτό που κάνεις δεν είναι buffer overrun. Ακόμα κι αν πετύχαινε δε βλέπω πώς θα σου χρησιμεύσει, αφού προϋποθέτει ότι ο κώδικάς σου εκτελείται ήδη (για να κάνεις το interpolation). Αν εκτελείται ήδη ο κώδικάς σου τότε κάνε κατευθείαν αυτό που ήθελες . Γιατί μας δίνεις την rawFuncCodeAddOne σε machine code αφού δεν παίζει ρόλο; Δώστην σε source με ένα comment για το πού βάζεις το inject ή τουλάχιστον σε assembly. Τζάμπα παίδεμα. Έχω πολύ καιρό να ασχοληθώ με assembly αλλά το 0xFF 0x15 δε μου φαίνεται για CALL. Είσαι σίγουρος; Καλα, το παραπανω ειναι πειραματικος κωδικας. Πριν αρχισω να κανω randoms overuns με τιποτα strcpy/memcpy θα επρεπε πρωτα να δω που μπορει να τρεξει. Για το call που λες, τι να σου πω.. ο compiler μου εδωσε τα εν λογο bytes. Ασε που και οταν το εβαλα ff στο ollydbg, αυτο μου το μεταφρασε σε call (βεβαια το 0x15.... ιδια δεν εχω για το τι ειναι ) Τεσπα, εκανα τα παρακατω >int WINAPI WinMain(HINSTANCE,HINSTANCE,char *,int) { funcPtr fp; int test = 0; void* vp = fp.ptr = VirtualAllocEx(GetCurrentProcess(),0, sizeof(rawFuncCodeAddOne), MEM_COMMIT,PAGE_EXECUTE_READWRITE); memcpy(fp.ptr,rawFuncCodeAddOne,sizeof(rawFuncCodeAddOne)); fp.call(&test); // ok /* fail se .data fp.ptr = rawFuncCodeAddOne; fp.call(&test); */ /* fail se heap fp.ptr = new char[123]; memcpy(fp.bptr,rawFuncCodeAddOne,sizeof(rawFuncCodeAddOne)); fp.call(&test); // */ /*fail se stack char s[100]; fp.bptr=s; memcpy(fp.bptr,rawFuncCodeAddOne,sizeof(rawFuncCodeAddOne)); fp.call(&test); */ /* ok edw xanw thn epafh me thn main stack ara den mporw na dw ti paizei an kai skaei sto pop stack ara fail? __asm mov ebp, dword ptr[rawFuncCodeAddOne] */ /* to idio me to panw __asm mov ebp, dword ptr[vp]; */ return 0; } Και αποτι βλεπω... δεν μπορεις να εκτελεσεις κωδικα στη stack/heap/.data . Μηπως ειναι μυθος οτι μπορει καποιος κακοβουλος να περασει κακοβουλο "κωδικα" μεσου overun?
defacer Δημοσ. 18 Ιουνίου 2012 Δημοσ. 18 Ιουνίου 2012 Και αποτι βλεπω... δεν μπορεις να εκτελεσεις κωδικα στη stack/heap/.data . Μηπως ειναι μυθος οτι μπορει καποιος κακοβουλος να περασει κακοβουλο "κωδικα" μεσου overun? Πλέον δε μπορείς γιατί οι επεξεργαστές υποστηρίζουν NX και τα λειτουργικά συστήματα DEP. Αυτό όμως δε σημαίνει ότι δε μπορείς να περάσεις κώδικα μέσω overrun (δηλαδή συγκεκριμένα κάνοντας overwrite τον EBP όπως είπα νωρίτερα). Η τεχνική ονομάζεται ROP και λέμε ότι "κάνεις ROP chains" γιατί συνήθως πρέπει να την επαναλάβεις αρκετές φορές τη μία μετά την άλλη. Update: δύσκολα θα βρεις n00b tutorial για τέτοια πράγματα, αλλά δες αν θέλεις αυτό το blog post (και όλο το blog της Corelan γενικότερα )
παπι Δημοσ. 18 Ιουνίου 2012 Μέλος Δημοσ. 18 Ιουνίου 2012 Πλέον δε μπορείς γιατί οι επεξεργαστές υποστηρίζουν NX και τα λειτουργικά συστήματα DEP. Αυτό όμως δε σημαίνει ότι δε μπορείς να περάσεις κώδικα μέσω overrun (δηλαδή συγκεκριμένα κάνοντας overwrite τον EBP όπως είπα νωρίτερα). Η τεχνική ονομάζεται ROP και λέμε ότι "κάνεις ROP chains" γιατί συνήθως πρέπει να την επαναλάβεις αρκετές φορές τη μία μετά την άλλη. Update: δύσκολα θα βρεις n00b tutorial για τέτοια πράγματα, αλλά δες αν θέλεις αυτό το blog post (και όλο το blog της Corelan γενικότερα ) Διαβαζα διαβαζα διαβαζα, και στο τελος (μπα καπου στην αρχη) λεει οτι πρεπει να καλεσεις virtualalloc ή καποιο αλλο απι για να εχεις μια μνημη που σε αφησει να εκτελεσεις κωδικα. Υποτιθεται οτι δεν μπορεις να καλεσεις καποιο απι εφοσον δεν εχεις προσβαση στη καταλληλη μνημη. Το θεμα ειναι, μπορεις 'η οχι με ενα paste να κανεις ζημια. Αποτι βλεπω το μονο που μπορεις ειναι να το κρασαρεις.
defacer Δημοσ. 18 Ιουνίου 2012 Δημοσ. 18 Ιουνίου 2012 Διαβαζα διαβαζα διαβαζα, και στο τελος (μπα καπου στην αρχη) λεει οτι πρεπει να καλεσεις virtualalloc ή καποιο αλλο απι για να εχεις μια μνημη που σε αφησει να εκτελεσεις κωδικα. Υποτιθεται οτι δεν μπορεις να καλεσεις καποιο απι εφοσον δεν εχεις προσβαση στη καταλληλη μνημη. Το θεμα ειναι, μπορεις 'η οχι με ενα paste να κανεις ζημια. Αποτι βλεπω το μονο που μπορεις ειναι να το κρασαρεις. Ναι, μπορείς να κάνεις ζημιά. Αλλά πρώτον το τι ακριβώς πρέπει να κάνεις paste προκύπτει μετά από εξονυχιστική ανάλυση του συγκεκριμένου process που θέλεις να κάνεις takeover (δηλαδή των modules που είναι φορτωμένα), από την οποία προκύπτει το τι gadgets έχεις στη διάθεσή σου για να κάνεις ROP και μετά gadgets + φαντασία = ROP chain και δεύτερον αν δεν έχεις την απαιτούμενη υπομονή δε θα καταλάβεις το πώς γίνεται. Θα σου πρότεινα να ξεκινήσεις με απλό RET exploit (π.χ. ένα "blind return"), αφού βέβαια πρώτα απενεργοποιήσεις τη DEP στην εφαρμογή-πειραματόζωο, για να μπεις σιγά σιγά στο νόημα. Άλλο το να μπορείς να καταλάβεις πως λειτουργεί κάτι διαβάζοντας κι άλλο το να μπορείς να το κάνεις μόνος σου στην πράξη. Είναι δύσκολη δουλειά και η εκμάθηση slow going.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα