Hi,
Folgendes Problem, ich hab einen SocketServer.TCPServer gebastelt der auch fleissig alles entgegen nimmt was ich ihm so sende.
Allerdings schickt der Client Shellcode, z.b. sowas:
"\x71\xF3\x9D\xC0\x71\x1B\x99\x99\x99\x7B\x60\x18\x75\x09\x98\x99"
wenn ich das nun mit connection.recv(1025) auslese bekomme ich einen String zurueck und das Problem ist, das jetzt manche
Zeichen des Shellcodes interpretiert werden naemlich so: "q\xf3\x9d\xc0q\x1b\x99\x99\x99{`\x18u\t\x98\x99"
Wie kann ich sicherstellen das die Zeichen so dargestellt werden wie sie abgeschickt wurden, ohne das Python da was reininterpretiert?
Mfg
Zero-Q
TCPServer / Shellcode
Da ist Byte für Byte genau das angekommen was Du abgeschickt hast. Die literale Zeichenkette '\x71' ist das Byte mit dem hexwert 0x71. Das ist zufällig der Code für das ASCII-Zeichen 'q'.
Code: Alles auswählen
In [75]: '\x71' == 'q'
Out[75]: True
Ja das stimmt, aber genau die umwandlung will ich ja nicht.
Es sollte halt einfach "\x71" stehen und nicht "q".
Da ich vor habe mit RegEx in den empfangenen Daten nach bestimmten Pattern zu Suchen ist das sehr unvorteilhaft.
Es sollte halt einfach "\x71" stehen und nicht "q".
Da ich vor habe mit RegEx in den empfangenen Daten nach bestimmten Pattern zu Suchen ist das sehr unvorteilhaft.
-
- User
- Beiträge: 773
- Registriert: Mittwoch 5. November 2003, 18:06
- Wohnort: Schweiz
- Kontaktdaten:
Hi
Er wandelt die Werte nicht um, sondern zeigt sie nur so an.
Es steht da immernoch '\x71' im String nur angezeigt wird halt ein 'q'.
Gruss
Er wandelt die Werte nicht um, sondern zeigt sie nur so an.
Es steht da immernoch '\x71' im String nur angezeigt wird halt ein 'q'.
Code: Alles auswählen
print data[0]
print '%X' % ord(data[0]) # ord wandelt ein Zeichen in den entsprechenden Zahlenwert um (nacher ist es ein Integer mit dem man rechnen kann)
print chr(0x71) # chr ist die Umkehrfunktion von ord. Wandlet ein Zahlenwert wieder in das Zeichen um.
Ich glaube Du hast da ein Verständnisproblem. '\x71' ist *ein* Byte und nicht 4. Es ist das selbe Byte das man auch als 'q' in ASCII darstellen kann. Da wird nichts in der Zeichenkette selbst umgewandelt, es wird Dir nur anders dargestellt.
Wie Du siehst kann man auch beide Darstellungsarten von 'q' benutzen um nach dem Byte zu suchen.
Code: Alles auswählen
In [16]: a = '\x71\xa5'
In [17]: a
Out[17]: 'q\xa5'
In [18]: len(a)
Out[18]: 2
In [19]: 'q' in a
Out[19]: True
In [20]: '\x71' in a
Out[20]: True