PNG Steganographie

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
nooby
User
Beiträge: 91
Registriert: Montag 12. März 2012, 20:39
Wohnort: 127.0.0.1

Hallo Leute :)

Ich habe eine Frage bezüglich Steganographie.
Ich habe von einem Freund eine PNG Datei mit einer versteckten Nachricht erhalten (eine Art Spiel).
Leider kriege ich es nicht hin diese Nachricht zu finden.
Ich habe bereits versucht die Rot/Blau/Grün Werte in Buchstaben umzuwandeln wie hier: https://www.daniweb.com/software-develo ... age-python. Das ganze hat jedoch keinen Sinnvollen Text gebracht. Außerdem habe ich versucht immer die Nachricht in den Least Significant Bits gesucht.
Auch das hat nicht funktioniert.
Den Code dazu seht ihr unten.
Falls ihr irgendeinen Tipp für mich habt bin ich euch dankbar :)

Code: Alles auswählen

def decode(img):
    text = ""
    character = ""
    height, width = img.size
    for row in range(height):
        for col in range(width):
            r, g, b, a = img.getpixel((row, col))
            print(a)
            r = bin(r)[-1]
            g = bin(g)[-1]
            b = bin(b)[-1]
            if len(character) == 8:
                character = int(character, 2)
                text += chr(character)
                character = r + g + b
            elif len(character) == 7:
                character += r
                character = int(character, 2)
                text += chr(character)
                character = g + b
            if len(character) == 6:
                character += r
                character += g
                character = int(character, 2)
                text += chr(character)
                character = str(b)
            else:
                character += r
                character += g
                character += b
    return text
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Gib doch mal das Bild.
Üblicherweise kodiert man die Länge des Payloads am Anfang und dann folgen die Daten. Da nicht mal klar ist ob überhaupt ASCII verwendet wird, ist das ein Rätsel.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@nooby: weißt Du denn, dass die Nachricht jeweils im untersten Bit in dieser Reihenfolge gespeichert ist?
nooby
User
Beiträge: 91
Registriert: Montag 12. März 2012, 20:39
Wohnort: 127.0.0.1

Nein, ob die Nachricht im untersten Bit gespeichert ist weiss ich nicht.
Das sind einfach die Dinge, die mir eingefallen sind das Bild darauf zu untersuchen.

@darktrym: Das Bild kann ich dir sonst per PN senden. Aber ich wil ja nicht das Jemand das Rätsel für mich löst :)
Ich suche einfach nach neuen Ideen..
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@nooby: es gibt halt eine große Anzahl an Möglichkeiten, erst alle roten Bits, dann alle blauen, dann alle grünen, oder nur jede zweite Zeile, alle Spalten von rechts nach links, usw.

Wurde der Text irgendwie verschlüsselt, ist es so gut wie unmöglich. Sonst ist es ja so, dass das höchste Bit bei Text so gut wie nie gesetzt ist, also kannst Du nach Mustern von nicht gesetzten Bits suchen.
nooby
User
Beiträge: 91
Registriert: Montag 12. März 2012, 20:39
Wohnort: 127.0.0.1

@Sirius3: Der Text ist soweit ich weiss nicht verschlüsselt.. Gibt es eine Technik die Suche einzugrenzen?
Z. B. in Photoshop durch das ausblenden eines Kanals oder ähnliches?
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Du kannst dir ja von PIL die ersten 20 Tupel ausgeben lassen. Wenn du davon die Binärdarstellung mit fester Länge mal anschaust sollten die offs. Varianten ausgeschlossen werden können. Bedenke aber der gute könnte auch einen eigenen Zeichensatz nehmen welcher nur 5Bits braucht.

Es gibt auch Varianten wo die untersten 2 Bits verwendet werden.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
nooby
User
Beiträge: 91
Registriert: Montag 12. März 2012, 20:39
Wohnort: 127.0.0.1

Ich habe mir jetzt ein Programm geschrieben, welche alle Bits vor dem LSB auf 0 setzt.
Ist das LSB 1, so wird dieses auf 255 gesetzt.
Jedoch weiß ich jetzt nicht, auf was die Farben hindeuten. Ich lade ein mal einen kleinen Ausschnitt hoch.

Vielen Dank für eure Mühen!

Original:
http://postimg.org/image/evakwytc9/

LSB:
http://postimg.org/image/g3mf86dkx/
BlackJack

@nooby: Die Frage ist ob die *Farben* irgend etwas bedeuten. Schau Dir doch mal die Bits an. Diese Linie aus Punkten am oberen Rand sieht ja schon mal nach Daten aus, denn bei einer Zeichnung sollte das rein weiss sein.

Edit: Wobei das Bild ja eher nach Hausaufgabe aussieht. ;-)
nooby
User
Beiträge: 91
Registriert: Montag 12. März 2012, 20:39
Wohnort: 127.0.0.1

Ja, das werde ich machen.
Ich versichere dir, das ist keine Hausaufgabe :)
Fürs Studium bin ich dann doch noch zu jung :mrgreen:
nooby
User
Beiträge: 91
Registriert: Montag 12. März 2012, 20:39
Wohnort: 127.0.0.1

Kann es sein, dass ich ein Fehler in meinem Code habe und ihn nicht bemerke?..
Denn ansonsten ist der Text garantiert nicht im ASCII Code. Was ich für die ersten 512 Pixel erhalte ist kompletter Müll...

Code: Alles auswählen

text = ""
character = ""
height, width = img.size
for row in range(1):
    for col in range(512):
        r, g, b, a = img.getpixel((col, row))
        r = bin(r)[-1]
        g = bin(g)[-1]
        b = bin(b)[-1]
        a = bin(a)[-1]
        
        if len(character) == 8:
            text += chr(int(character, 2))
            character = r + g + b + a
        elif len(character) == 7:
            character += r
            text += chr(int(character, 2))
            character = g + b + a

        elif len(character) == 6:
            character += r + g
            text += chr(int(character, 2))
            character = b + a

        elif len(character) == 5:
            character += r + g + b
            text += chr(int(character, 2))
            character = a
        else:
            character += r + g + b + a
Text:
'\x7fþÿÞÿþÿÞûßÿÞ\x7fßÿþÿþÿþûþÿþûþÿþûþÿþûÿ\x7fþûþ\x7fþûßÿÞÿþÿþ\x7fßÿþûþÿþûß\x7fþûþ\x7fþÿþÿþ{Þ\x7fÞ\x7fßÿÞÿÞÿþûß\x7fþ{Þ\x7fÞ\x7fÿ\x7fþÿÿ\x7fþûß\x7fþ{þÿþûÞ\x7fþûÿ\x7fþ\x7fÞÿþÿÿ\x7fþ\x7fþ\x7fþ\x7fÿ\x7fþûß\x7fþ{Þ\x7fÞ\x7fÿ\x7fþûþ\x7fþ{þ\x7fþ{þ\x7fþûß\x7fþ{ß\x7fþ{Þ\x7fÞûþ\x7fþ{ß\x7fþ{þûþ{Þ\x7fÞûÞ\x7fÞ\x7fÿ\x7fþûÞ\x7fþûÿ\x7fþ{Þ\x7fÞÿÞÿþ{þÿþûÞ\x7fþ\x7fÞÿþÿþ\x7fþ\x7fÿ\x7fþÿÿ\x7fþÿÞ\x7fþ{Þ\x7fÞÿÿ\x7fþÿÿ\x7fþÿÿ\x7fþ\x7fß\x7fþ{Þ{'
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Ich versteh ich immer noch nicht, was denn Nutzdaten sind. Lass dir mal die Daten ausgeben wie folgt.

1. Pixel Komp. 1 Komp. 2. Komp. 3
2. Pixel Komp. 1 Komp. 2. Komp. 3

Und die Reihenfolge der Informationen ist natürlich entscheidend. Möglicherweise auch spiegelverkehrt, je nachdem wie man rangeht.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
nooby
User
Beiträge: 91
Registriert: Montag 12. März 2012, 20:39
Wohnort: 127.0.0.1

Die Pixel-Daten sind wie folgt.
Pixel 0 R: 254
Pixel 0 G: 255
Pixel 0 B: 255
Pixel 0 A: 255
Pixel 1 R: 255
Pixel 1 G: 255
Pixel 1 B: 255
Pixel 1 A: 255
Pixel 2 R: 255
Pixel 2 G: 255
Pixel 2 B: 255
Pixel 2 A: 255
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@nooby: wie Du ja schon selbst gesehen hast, ist in der ersten Zeile Deines Bildes etwas komisch. Statt reinem Weis sind die letzten Bits mal gesetzt mal nicht. Und wie Du inzwischen auch herausgefunden hast, gibt es bei PNG-Dateien nicht nur RGB sondern auch noch A. Wenn Du Dir jetzt Deine Decodierversuche anschaust, siehst Du, dass statistisch gesehen viel zu viele 1 vorkommen. Das heißt, nicht jedes letzte Bit enthält Information sondern nur ausgewählte. Du mußt also ein Muster finden, welche Bits relevant sind. Aber jetzt habe ich schon genug verraten.

Willst Du eigentlich an das Passwort einer verschlüsselten ZIP-Datei kommen?
nooby
User
Beiträge: 91
Registriert: Montag 12. März 2012, 20:39
Wohnort: 127.0.0.1

@Sirius3: Hmm..okay danke..
Werd ich mich nochmals dran setzen.
Nein, es ist kein Passwort oder so. Also nicht das ich wüsste..
Hast du die Nachricht denn schon entschlüsselt?
nooby
User
Beiträge: 91
Registriert: Montag 12. März 2012, 20:39
Wohnort: 127.0.0.1

@Sirius3: Falls du das ganze gelöst hast, so habe ich noch eine Frage.
Es ist möglich, dass ich ebenfalls auf die Lösung gestoßen bin. Aber alles ist mir noch nicht klar.
Den Text denn ich erhalte ist in Anagramm form. Und einiges davon ist mir nicht klar.
Kann ich dir den Text per PN zu kommen lassen?

Besten Dank

Nooby

//Edit:
Sorry war ein Dummerfehler..
Die Aufgabe ist gelöst!
Besten dank allen. Ist echt ein Top Forum hier!
Antworten