Μετάβαση στο περιεχόμενο

Αναζήτηση στην κοινότητα

Εμφάνιση αποτελεσμάτων για τις ετικέτες 'reversing'.

  • Αναζήτηση με βάση τις ετικέτες

    Πληκτρολογήστε τις ετικέτες και χωρίστε τες με κόμμα.
  • Αναζήτηση με βάση τον συγγραφέα

Τύπος περιεχομένου


Ενότητες

  • GreekHacking
    • Κανόνες & Ανακοινώσεις
    • Καλωσόρισμα νέων μελών
    • Προτάσεις / Βελτιώσεις
    • Νέα σχετικά με το Hacking/Security
    • Ασφάλεια & Προστασία Δεδομένων
    • Εκτός Θέματος
  • Leaks
    • Hacking Tutorials
    • Anonymity & Privacy / Ανωνυμία και Προστασία Προσωπικών Δεδομένων
    • Προγράμματα για Hacking / Hacking Programs
    • Cracking Οδηγοί & Πληροφορίες
    • Βιβλία σχετικά με το Hacking
    • Προγράμματα - High Quality downloads
    • E-Books
    • XXX Movies

Categories

  • Ορολογίες
  • Hacking για αρχάριους
  • Hacking για προχωρημένους
  • Mobile Hacking
  • Cracking Tutorials
  • Hacking Computers
  • Hacking Tutorials στα Αγγλικά
  • Tutorials for hacks
  • Διάφοροι Οδηγοί
    • Οδηγοί σχετικά με τα Linux
    • Οδηγοί για υπολογιστές
    • Οδηγοί σχετικά με τα Mac
    • Οδηγοί για κινητά
  • Hacking Tutorials στα Αγγλικά Copy

Categories

  • Hacking
  • Ιστοσελίδες/Server
  • Hardware
  • Windows

Βρείτε αποτελέσματα...

Βρείτε αποτελέσματα που...


Ημερομηνία δημιουργίας

  • Start

    End


Τελευταία ενημέρωση

  • Start

    End


Φιλτράρισμα με βάση τον αριθμό των...

  1. Reversing Windows Native Api Functions Θα παίξουμε ένα μικρό παιχνίδι. Θα δούμε πως ψάχνουμε μέσα στο native API των windows για functions οι οποίες χρησιμοποιούνται από τις εσωτερικές διεργασίες του λειτουργικού συστήματος και δεν συνίσταται (από την μαμά) να καλούνται από τα προγράμματα μας. Όχι μόνο θα τις ανακαλύψουμε, αλλά θα τις καλέσουμε και θα ελέγξουμε τα αποτελέσματα τους. Όπως είπαμε, θα χρησιμοποποιήσουμε συναρτήσεις που βρίσκονται μέσα στο native API των Windows. Το native API είναι ένα επίπεδο πιο κάτω από το γνωστό Base API που η μαμά συστήνει (και όχι άδικα) να χρησιμοποιούμε για λόγους συμβατότητας και για να διασφαλίσουμε οτι τα προγράμματα μας θα τρέχουν σε όλες τις εκδόσεις και Service Packs των windows. Το Native API είναι το τελευταίο layer σε user mode το οποίο κάνει άμεσες κλήσεις στο kernel mode των windows και συγκεκριμένα μέσα στο NTOSKRNL.EXE που είναι ο pure windows kernel. Πρέπει να πω εδώ οτι (κατά την άποψη μου) η διαδικασία ελέγχου των συναρτήσεων native APIs δεν είναι μια εύκολη διαδικασία. Θα πω οτι είναι δυσκολότερη από αυτή του linux αφου ο κώδικας των windows είναι κλειστός και δεν παρέχονται sources. Μόνο κώδικας assembly και αυτός (στις περισσότερες φορές είναι έξω από από τον kernel). Αν θέλουμε να debug-άρουμε τον ίδιο τον kernel χρειάζονται πιο ειδικά προγράμματα που δεν θα τα δείξουμε σε αυτόν τον ποστ. Εδώ θα δούμε πως ακόμα και από user-mode μπορούμε να δούμε διαδικασίες και συναρτήσεις (ακόμα και undocumented) μέσα στο Native API Interface ή αλλιώς μέσα στο ntdll.dll. Θα μου πείτε: Γιατί να το κάνουμε όλο αυτό? Χμ.... οι λόγοι είναι πολλοί: 1. Είναι ένα πολύ καλό πρώτο μάθημα για τους επίδοξους reversers του λειτουργικού. Σε αρχικό στάδιο βέβαια! 2. Θα μάθουμε πως να ελέγχουμε τα βασικά των εσωτερικών διεργασιών του συστήματος μας. 3. θα δούμε από πρώτο χέρι να τρέχει κώδικας των windows που ανήκει στο (ολίγον cryptic) native API επίπεδο. Γνώσεις που απαιτούνται για να διαβάσετε το ποστ? Oχι πολλές. 1. Στοιχειώδεις γνώσεις τεχνικών reversing και δη, χρήσης του olly debugger. 2. Μικρή (ναι μικρή) όσο κι αν φανεί παράδοξο, γνώση assembly language. θα συναντήσουμε (μοιραία) πολύ κώδικα assembly, αλλά δεν θα αναλώσω το ποστ (αυτό τουλάχιστον) σε στείρα assembly listings με επεξηγήσεις, Θα δούμε μάλιστα πως αυτό που θέλουμε να κάνουμε δεν απαιτεί κάποιον assembly programmer. Πρώτα απ' όλα να πώ οτι η ntdll.dll που υλοποιεί το native api είναι μέσα στο c:\windows\system32. Καλό είναι να την κάνουμε ένα copy/paste σε ένα άλλο directory και να την δουλέψουμε εκεί. Το παράδειγμα μας θα γίνει σε box με windows 7 ultimate 64bit. Αυτό που θα κάνω πρώτα είναι να εξάγω από αυτήν όλες τις functions που χρησιμοποιεί και να επιλέξω μια (στην τύχη...?) για να ελέγξω. Για να εξάγω τις exported functions από μια DLL θα χρησιμοποιήσω το πρόγραμμα dumpbin που προσφέρται από την μαμά μαζί με το Visual Studio. Δίνω D:\work2>dumpbin ntdll.dll /exports > exports.txt και δημιουργώ το exports.txt που περιέχει τις export functions της ntdll.dll Ανοίγοντας το με τον ultraedit θα δω το παρακάτω: Ψάχνοντας λίγο το αρχείο, "πέφτω" επάνω στο παρακάτω: ordinal hint RVA name 933 398 0003859A RtlGetVersion Βλέπω την συνάρτηση RtlGetVersion η οποία βρίσκεται στην RVA (Relative Virtual Address) 3859Α. Το RVA είναι η σχετική διεύθυνση που θα φορτωθεί η function RtlGetVersion όταν το αρχείο που την περιέχει φορτωθεί στην μνήμη και αποκτήσει Base Address. Αν δηλαδή το RVA μιας συνάρτησης είναι το 15 και το εκτελέσιμο φορτωθεί στην θέση 100, τότε η συνάρτηση μου θα βρίσκεται στην θέση (διεύθυνση) 115. Θέλω τώρα να δω τι ακριβώς κάνει αυτή η συνάρτηση. Για να το κάνω αυτό κάνω disassemble όλη την ntdll.dll: D:\work2>dumpbin /disasm ntdll.dll > ntdlldisasm.txt Το αρχείο ntdlldisasm.txt που δημιουργείται περιέχει όλο τον assembly κώδικα της dll. Είναι ένα ASCII αρχείο 17Mb! Χμ... πως θα βρώ τώρα σε ποιό σημείο καλείται η RtlGetVersion; Χμ... καθόλου δύκολο. Αρκεί να εφαρμόσω τον τύπο: IMAGE_BASE_ADDRESS + Function_RVA = Function Address Το RVA το έχουμε. Είναι 0003859A. Το IMAGE_BASE_ADDRESS της DLL όμως ποιό είναι; Για να το βρω δίνω απλά: D:\work2>dumpbin /headers ntdll.dll | find "image base" 7DE70000 image base (7DE70000 to 7DFEFFFF) Οπότε 7DE70000 + 0003859A = 7DEA859A. Άρα στην διεύθυνση 7DEA859A βρίσκεται η συνάρτηση RtlGetVersion. Ολόκληρος ο κώδικας της συνάρτησης RtlGetVersion είναι ο παρακάτω: 7DEA859A: 8B FF mov edi,edi 7DEA859C: 55 push ebp 7DEA859D: 8B EC mov ebp,esp 7DEA859F: 51 push ecx 7DEA85A0: 64 A1 18 00 00 00 mov eax,dword ptr fs:[00000018h] 7DEA85A6: 53 push ebx 7DEA85A7: 56 push esi 7DEA85A8: 8B 75 08 mov esi,dword ptr [ebp+8] 7DEA85AB: 57 push edi 7DEA85AC: 8B 78 30 mov edi,dword ptr [eax+30h] 7DEA85AF: 8B 87 A4 00 00 00 mov eax,dword ptr [edi+000000A4h] 7DEA85B5: 89 46 04 mov dword ptr [esi+4],eax 7DEA85B8: 8B 87 A8 00 00 00 mov eax,dword ptr [edi+000000A8h] 7DEA85BE: 89 46 08 mov dword ptr [esi+8],eax 7DEA85C1: 0F B7 87 AC 00 00 movzx eax,word ptr [edi+000000ACh] 00 7DEA85C8: 89 46 0C mov dword ptr [esi+0Ch],eax 7DEA85CB: 8B 87 B0 00 00 00 mov eax,dword ptr [edi+000000B0h] 7DEA85D1: 89 46 10 mov dword ptr [esi+10h],eax 7DEA85D4: 8B 87 F4 01 00 00 mov eax,dword ptr [edi+000001F4h] 7DEA85DA: 85 C0 test eax,eax 7DEA85DC: 74 0A je 7DEA85E8 7DEA85DE: 66 83 38 00 cmp word ptr [eax],0 7DEA85E2: 0F 85 BB 78 05 00 jne 7DEFFEA3 7DEA85E8: 33 C0 xor eax,eax 7DEA85EA: 66 89 46 14 mov word ptr [esi+14h],ax 7DEA85EE: 81 3E 1C 01 00 00 cmp dword ptr [esi],11Ch 7DEA85F4: 75 5E jne 7DEA8654 7DEA85F6: 66 0F B6 87 AF 00 movzx ax,byte ptr [edi+000000AFh] 00 00 7DEA85FE: 66 89 86 14 01 00 mov word ptr [esi+00000114h],ax 00 7DEA8605: 66 8B 87 AE 00 00 mov ax,word ptr [edi+000000AEh] 00 7DEA860C: B9 FF 00 00 00 mov ecx,0FFh 7DEA8611: 66 23 C1 and ax,cx 7DEA8614: 66 89 86 16 01 00 mov word ptr [esi+00000116h],ax 00 7DEA861B: 66 A1 D0 02 FE 7F mov ax,word ptr ds:[7FFE02D0h] 7DEA8621: 66 89 86 18 01 00 mov word ptr [esi+00000118h],ax 00 7DEA8628: 8D 45 FC lea eax,[ebp-4] 7DEA862B: 8D BE 1A 01 00 00 lea edi,[esi+0000011Ah] 7DEA8631: 50 push eax 7DEA8632: C6 07 00 mov byte ptr [edi],0 7DEA8635: E8 28 00 00 00 call 7DEA8662 7DEA863A: 84 C0 test al,al 7DEA863C: 74 16 je 7DEA8654 7DEA863E: 8B 45 FC mov eax,dword ptr [ebp-4] 7DEA8641: 88 07 mov byte ptr [edi],al 7DEA8643: 83 F8 01 cmp eax,1 7DEA8646: 75 0C jne 7DEA8654 7DEA8648: B8 EF FF 00 00 mov eax,0FFEFh 7DEA864D: 66 21 86 18 01 00 and word ptr [esi+00000118h],ax 00 7DEA8654: 5F pop edi 7DEA8655: 5E pop esi 7DEA8656: 33 C0 xor eax,eax 7DEA8658: 5B pop ebx 7DEA8659: C9 leave 7DEA865A: C2 04 00 ret 4 Ο παραπάνω κώδικας παρουσιάζεται μόνο για την γνωσιολογική επάρκεια μιας και όπως είπα δεν θα μπω στην διαδικασία να τον αναλύσω γραμμή προς γραμμή - dead listing analysis (στο post αυτό τουλάχιστον). Θα κάνω κάτι πιο... πρακτικό. θα τον εκτελέσω μέσα από τον olly και θα παρακολουθήσω τα αποτελέσματα. Πως όμως θα καλέσω την συγκεκριμένη function μέσα σε μια DLL; Με τον olly δεν είναι και τόσο δύσκολο. Πριν όμως ξεκινήσω τον έλεγχο ας δω πρώτα αν η RtlGetVersion είναι documented από την Microsoft. Πράγματι εδώ βρίσκεται περιγραφή της συγκεκριμένης συνάρτησης: The RtlGetVersion routine returns version information about the currently running operating system. Syntax NTSTATUS RtlGetVersion( __out PRTL_OSVERSIONINFOW lpVersionInformation ); Parameters lpVersionInformation [out] Pointer to either a RTL_OSVERSIONINFOW structure or a RTL_OSVERSIONINFOEXW structure that contains the version information about the currently running operating system. A caller specifies which input structure is used by setting the dwOSVersionInfoSize member of the structure to the size in bytes of the structure that is used. Return Value RtlGetVersion returns STATUS_SUCCESS. Remarks RtlGetVersion is the kernel-mode equivalent of the user-mode GetVersionEx function in the Windows SDK. See the example in the Windows SDK that shows how to get the system version. Απ' ότι βλέπω η συνάρτηση αυτή δεν δέχεται input parameter και όταν κληθεί επιστρέφει τα αποτελέσματα του στην structure RTL_OSVERSIONINFOW. H structure αυτή ορίζεται εδώ και περιέχει τα εξής βασικά στοιχεία του λειτουργικού: dwOSVersionInfoSize Specifies the size in bytes of an RTL_OSVERSIONINFOW structure. This member must be set before the structure is used with RtlGetVersion. dwMajorVersion Identifies the major version number of the operating system. For example, for Windows 2000, the major version number is five. dwMinorVersion Identifies the minor version number of the operating system. For example, for Windows 2000 the minor version number is zero. dwBuildNumber Identifies the build number of the operating system. dwPlatformId Identifies the operating system platform. For Microsoft Win32 on NT-based operating systems, RtlGetVersion returns the value VER_PLATFORM_WIN32_NT. szCSDVersion Contains a null-terminated string, such as "Service Pack 3", which indicates the latest Service Pack installed on the system. If no Service Pack has been installed, the string is empty. Ωραία μέχρι εδώ. Έμαθα τι περιμένω να πάρω σαν αποτέλεσμα. Ας επανέλθουμε στο πως θα εκτελέσω την function αυτή με τον olly. Επειδή πρόκειται για μια DLL και όχι για κάποιο εκτελέσιμο πρόγραμμα, θα κάνω το εξής: Αφού φορτώσω την DLL θα πάω στην διεύθυνση που καλείται η προς εξέταση function και θα το ορίσω ως νέο orign point, όπως φαίνεται στην επόμενη εικόνα: Παρατηρήστε οτι η διεύθυνση της RtlGetVersion δεν είναι η ίδια με αυτή που έδωσε το output του hexdump. Αυτό δεν είναι περίεργο και εξηγήται από το γεγονός πως η Base Image Address είναι διαφορετική. Αφού λοιπόν καθορίσω το νέο σημείο εκκίνησης βάζω και ένα Break Point στην διεύθυνση 776D859A και είμαι έτοιμος να πατήσω RUN και μετά να πάω step by step (πατώντας F10) παρακολουθώντας τη εκτέλεση της συνάρτησης γραμμή-γραμμή και ελέγχοντας ταυτόχρονα τις τιμές των καταχωρητών. Επίσης, για να ελέγξω τα αποτελέσματα μου καλύτερα κάνω και το εξής κόλπο: Από command line δίνω την εντολή "winver" για να δω (με βάση το documentation της μαμάς) τι τιμές θα πάρω και πού. Το winver μου δίνει: Παρατηρήστε το "Version 6.1 (Build 7600)". Πρέπει, κι εγώ, εκτελώντας την function να πάρω τα... ανάλογα Παρακάτω έχω μια ανάλυση του κώδικα που έδωσε ο olly μαζί με σχόλια (δικά μου) για τις τιμές των καταχωρητών που πήρα. Νομίζω οτι είναι ιδαίτερα διαφωτιστικά και δεν χρειάζονται πολλά-πολλά σχόλια: 776D859A > 8BFF MOV EDI,EDI | 776D859C 55 PUSH EBP | Standard function prologue 776D859D 8BEC MOV EBP,ESP | 776D859F 51 PUSH ECX 776D85A0 64:A1 18000000 MOV EAX,DWORD PTR FS:[18] ====>> return the TEB (Thread Entry Block) address 776D85A6 53 PUSH EBX 776D85A7 56 PUSH ESI 776D85A8 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8] ====>> return the PEB (Process Entry Block) address 776D85AB 57 PUSH EDI 776D85AC 8B78 30 MOV EDI,DWORD PTR DS:[EAX+30] 776D85AF 8B87 A4000000 MOV EAX,DWORD PTR DS:[EDI+A4] ===>> eax=6 (MajorVersion) 776D85B5 8946 04 MOV DWORD PTR DS:[ESI+4],EAX 776D85B8 8B87 A8000000 MOV EAX,DWORD PTR DS:[EDI+A8] ===>> eax=1 (MinorVersion) 776D85BE 8946 08 MOV DWORD PTR DS:[ESI+8],EAX 776D85C1 0FB787 AC000000 MOVZX EAX,WORD PTR DS:[EDI+AC] ===>> eax=00001DB0 i.e. 7600 (BuildNumber) MOV with zero eXtended 776D85C8 8946 0C MOV DWORD PTR DS:[ESI+C],EAX 776D85CB 8B87 B0000000 MOV EAX,DWORD PTR DS:[EDI+B0] ===>> eax=2 (platformID) 776D85D1 8946 10 MOV DWORD PTR DS:[ESI+10],EAX 776D85D4 8B87 F4010000 MOV EAX,DWORD PTR DS:[EDI+1F4] 776D85DA 85C0 TEST EAX,EAX 776D85DC 74 0A JE SHORT ntdll.776D85E8 776D85DE 66:8338 00 CMP WORD PTR DS:[EAX],0 776D85E2 0F85 BB780500 JNZ ntdll.7772FEA3 776D85E8 33C0 XOR EAX,EAX 776D85EA 66:8946 14 MOV WORD PTR DS:[ESI+14],AX 776D85EE 813E 1C010000 CMP DWORD PTR DS:[ESI],11C 776D85F4 75 5E JNZ SHORT ntdll.776D8654 776D85F6 66:0FB687 AF0000>MOVZX AX,BYTE PTR DS:[EDI+AF] 776D85FE 66:8986 14010000 MOV WORD PTR DS:[ESI+114],AX 776D8605 66:8B87 AE000000 MOV AX,WORD PTR DS:[EDI+AE] 776D860C B9 FF000000 MOV ECX,0FF 776D8611 66:23C1 AND AX,CX 776D8614 66:8986 16010000 MOV WORD PTR DS:[ESI+116],AX 776D861B 66:A1 D002FE7F MOV AX,WORD PTR DS:[7FFE02D0] 776D8621 66:8986 18010000 MOV WORD PTR DS:[ESI+118],AX 776D8628 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4] 776D862B 8DBE 1A010000 LEA EDI,DWORD PTR DS:[ESI+11A] 776D8631 50 PUSH EAX 776D8632 C607 00 MOV BYTE PTR DS:[EDI],0 776D8635 E8 28000000 CALL ntdll.RtlGetNtProductType 776D863A 84C0 TEST AL,AL 776D863C 74 16 JE SHORT ntdll.776D8654 776D863E 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 776D8641 8807 MOV BYTE PTR DS:[EDI],AL 776D8643 83F8 01 CMP EAX,1 776D8646 75 0C JNZ SHORT ntdll.776D8654 776D8648 B8 EFFF0000 MOV EAX,0FFEF 776D864D 66:2186 18010000 AND WORD PTR DS:[ESI+118],AX 776D8654 5F POP EDI 776D8655 5E POP ESI 776D8656 33C0 XOR EAX,EAX 776D8658 5B POP EBX 776D8659 C9 LEAVE 776D865A C2 0400 RETN 4 Πολύ καλά. Πήρα (απ' ότι βλέπετε) τα ανάλογα! Έχω να κάνω ακόμα μια μικρή παρατήρηση. Όχι τίποτε άλλο αλλά για να σας προετοιμάσω και για τα επόμενα ανάλογα tuts. Προσέξτε την διεύθυνση 776D8635. Εκεί καλείται μια function, η RtlGetNtProductType. H function αυτή είναι μάλλον εσωτερική και... undocumented. Πιο πολλά γι' αυτές σε κάποιο επόμενο post μαζί με τρόπους για το πως κάνουμε debug τον kernel. Μέχρι τώρα κατάφερα τα εξής: 1. Είδα ποιες functions υπάρχουν μέσα στην ntdll.dll 2. Απομόνωσα και διάβασα μια από αυτές. 3. Την εκτέλεσα και είδα τα αποτελέσματα της γραμμή-γραμμή. Να πω πάλι οτι αυτή η function βρίσκεται μέσα στο native API. Εκεί γίνονται κλήσεις κατ' εθυείαν στον Kernel των windows. Πρόκειται για αρκετά "επικίνδυνα νερά", που αν εκεί κάτι δεν πάει καλά μπορεί να κρεμάσει όλο το σύστημα (στην καλύτερη!). Παρατήρηση: Είδαμε μέχρι τώρα οτι οι συναρτήσεις που κοιτάμε αρχίζουν από Rtl. Τυχαίο? Δεν νομίζω! Οι μαμά έχει επιλέξει ένα συγκεκριμένο name convention για τις εσωτερικές συναρτήσεις της. Το prefix Rtl σημαίνει Run Time Library. Επίσης, μέσα στην ntdll θα δούμε και το περίφημο Zw prefix. Συναρτήσεις με αυτό το prefix κάνουν κλήσεις στον πυρήνα. Γενικά, να ξέρετε, οτι το name convention που ακολουθείται είναι: <Prefix><Operation><Object> Καλά μέχρι εδώ αλλά μου λείπει όμως κάτι: Ένα πρόηγραμμα σε C που να καλεί κατευθείαν αυτή την function από το native api και που ίσως ( λέω ίσως, ποιός ξέρει; ) να χρησιμοποιηθεί και σαν εφαλτήριο για μελλοντικούς ελέγχους άλλων πιο... άγνωστων συναρτήσεων. Αν ψάξετε στο net η αλήθεια είναι οτι δεν θα βρείτε και πολλά πράγματα για το πως καλείτε αυτή την συνάρτηση μέσα από το native api. Όποτε καλό είναι να υπάρχει ο κώδικας σε C εδώ για να μπορέσει να τον βρει και κανένας άλλος. 😉 Το προγραμματάκι (σε visual C++ / Visual Studio 2010) είναι το παρακάτω: // Kernel01.cpp : Call the RtlGetVersion from native API // #include "stdafx.h" #include <Windows.h> typedef void (WINAPI *pwinapi)(PRTL_OSVERSIONINFOW); // [url="http://www.osronline.com/ddkx/kmarch/k109_452q.htm"]http://www.osronline...h/k109_452q.htm[/url] int _tmain(int argc, _TCHAR* argv[]) { RTL_OSVERSIONINFOW info; pwinapi p_pwinapi; ZeroMemory(&info, sizeof(RTL_OSVERSIONINFOW)); p_pwinapi = (pwinapi) GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "RtlGetVersion"); p_pwinapi(&info); return(0); } Τρέχοντας το και βάζοντας στην return(0) ένα breakpoint, βλέπουμε την... αλήθεια. Δεν χρειάζεται να ξοδέψω άλλα bytes για να σχολιάσω. Δοκιμάστε το και μόνοι σας... Κάντε debug ή ακόμα και disassemble το πρόγραμμα αυτό και ξανακάντε την διαδικασία που μόλις περιγράφτηκε. Σας υπόσχομαι οτι δεν θα χάσετε! Happy Reversing...

ChatBox

ChatBox

Chatroom Rules

  • Το GreekHacking.Gr είναι ένα ελληνικό forum και επιτρέπεται μόνο η χρήση της Ελληνική Γλώσσας (ούτε greeklish).
  • Δεν επιτρέπονται οι βρισιές και γενικά η χρήση χυδαίας γλώσσας.
  • Απαγορεύεται αυστηρά το πορνογραφικό, προσβλητικό και βίαιο περιεχόμενο.
  • Μην χρησιμοποιείτε κεφαλαία γράμματα η σύμβολα.
×
×
  • Create New...