TCPServer / Shellcode

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
zero-q
User
Beiträge: 3
Registriert: Mittwoch 19. Juli 2006, 20:04

Mittwoch 19. Juli 2006, 20:35

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
BlackJack

Mittwoch 19. Juli 2006, 21:08

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
zero-q
User
Beiträge: 3
Registriert: Mittwoch 19. Juli 2006, 20:04

Mittwoch 19. Juli 2006, 21:32

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.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Donnerstag 20. Juli 2006, 08:13

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

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

Donnerstag 20. Juli 2006, 08:17

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.

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
Wie Du siehst kann man auch beide Darstellungsarten von 'q' benutzen um nach dem Byte zu suchen.
zero-q
User
Beiträge: 3
Registriert: Mittwoch 19. Juli 2006, 20:04

Donnerstag 20. Juli 2006, 09:21

In der Tat =)
Ich danke euch für eure Hilfe.

Dann wird da wohl ein anderes Problem mit meinen Regular Expressions vorliegen.
Ich denke damit hat sich die Sache erstmal geklärt.
Antworten