Ein zufälliges Bit eines Strings kippen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fuzzing
User
Beiträge: 4
Registriert: Donnerstag 2. August 2012, 12:55

Donnerstag 2. August 2012, 13:07

Hallo,

zwecks Fuzzing möchte ich ein zufälliges Bit eines 147 char-langes Strings (1176 Bits) kippen.

Habe mit python noch nicht viel Erfahrung und bisher folgenden Ansatz ausprobiert, der leider nicht funktioniert:

Der String ist in "buffer"

randomBit = 0b1
binBuffer = 0b0
binBuffer = bin(buffer)
binBuffer = binBuffer^(randomBit<<randint(0,1175))
buffer = str(binBuffer)

Hoffe jemand kann mir dabei helfen, meine Lösung ist wohl etwas zu einfach gedacht :mrgreen:
EyDu
User
Beiträge: 4872
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Donnerstag 2. August 2012, 13:20

Hallo und willkommen im Forum!

Am einfachsten ist es, wenn du den String einfach in einen Integer umwandelst:

Code: Alles auswählen

>>> text = "spam ham and eggs"
>>> n = sum(ord(c)<<8*i for (i, c) in enumerate(text[::-1]))
>>> n += 1
>>> "".join(chr((n>>8*i)&0xFF) for i in range(len(text)))[::-1]
'spam ham and eggt' 
Das +1 ist natürlich nur ein Beispiel, hier musst du dann deine kokrete Operation einsetzen. Ob du die Reihenfolge der Zeichen in den Strings umdrehen musst hängt natürlich von deiner Anwendung ab.

Sebastian
Das Leben ist wie ein Tennisball.
fuzzing
User
Beiträge: 4
Registriert: Donnerstag 2. August 2012, 12:55

Donnerstag 2. August 2012, 13:45

habe jetzt folgende Zeilen hinzugefügt:

randomBit = bin(1)
n = sum(ord(c)<<8*i for (i, c) in enumerate(buffer[::-1]))
n = n^(randomBit<<randint(0,1175))
"".join(chr((n>>8*i)&0xFF) for i in range(len(buffer)))[::-1]

=>
invalid syntax in
"".join(chr((n>>8*i)&0xFF) for i in range(len(buffer)))[::-1]
am ;
Benutzeravatar
snafu
User
Beiträge: 5925
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Donnerstag 2. August 2012, 14:00

Tja, das passiert, wenn man blindes Copy&Paste macht (unterstelle ich jetzt einfach mal). Aufgrund eines Bugs im Forumcode wird aus dem kaufmännischen Und (&) immer ein ``&``. Das musst du halt manuell ersetzen.
fuzzing
User
Beiträge: 4
Registriert: Donnerstag 2. August 2012, 12:55

Donnerstag 2. August 2012, 14:10

snafu hat geschrieben:Tja, das passiert, wenn man blindes Copy&Paste macht (unterstelle ich jetzt einfach mal). Aufgrund eines Bugs im Forumcode wird aus dem kaufmännischen Und (&) immer ein ``&``. Das musst du halt manuell ersetzen.
ok dieser Fehler ist schonmal weg.

jetzt hab ich noch einen in
randomBit = bin(1)

Und die Zeile
n = n^(randomBit<<randint(0,1175))

ist so ok für mein Vorhaben?
fuzzing
User
Beiträge: 4
Registriert: Donnerstag 2. August 2012, 12:55

Donnerstag 2. August 2012, 14:17

habe jetzt einfach
randomBit = 1
und nun läufts durch.
jerch
User
Beiträge: 1633
Registriert: Mittwoch 4. März 2009, 14:19

Donnerstag 2. August 2012, 19:40

@fuzzing:
Ja das funktioniert so. Allerdings würde ich es wohl über 8Bit-integer mit String-Slicing machen und nicht den ganzen String in eine Zahl wandeln, ungetestet:

Code: Alles auswählen

byte, bit = divmod(randint(0, 1175), 8)
s = s[:byte] + chr(ord(s[byte]) ^ (1<<bit)) + s[byte+1:]
Antworten