Anruf printf () Bearbeiten der ausführbaren
-
09-10-2019 - |
Frage
Ich versuche zu „knacken“ ein Konsolenprogramm, es zwingt etwas anzuzeigen. Das Problem ist, ich nicht eine neue Zeile (\r\n
) drucken kann.
Mit einem disassebler fand ich den Ort und die binären bearbeitet:
push 4ad0eb46 ; the string (let's pretend "Hi guys")
push 4ad0eb80 ; and the format ("%s")
call near ds:[<&msvcrt.printf>] ; call printf
jmp 4ad0eb4f ; skip data
; now here I coded the strings
mov ds:[4ad289ec],eax ; and here the program resumes
Wie gesagt, ich kann nicht eine neue Zeile drucken. Ich habe versucht, kodieren "\r\n"
im Format-String (so es "%s\r\n"
wird, wie ich es in C tun würde) und gedruckt "Hi guys\r\n"
bekommen, und kodieren sie in der
String selbst (so dass es "Hi guys\x13\x10"
) und get "Hi guys"
und zwei seltsame Zeichen, wahrscheinlich die ASCII-Darstellung von 0x13 und 0x10.
Lösung
Ihr zweiter Versuch, mit den Zeichen direkt in die String einbetten, war der richtige Ansatz. Allerdings haben Sie die falschen Zeichen Zahlen verwendet. Die Zahlen für die Rückgabe / Zeilenvorschub in ASCII 13 und 10 (dezimal), die 0x0d und 0x0A (hex) ist. Sie haben verwendet 0x13 und 0x10, die unterschiedliche Charaktere sind.
In der Tabelle unter Codepage 437 für die Zeichenzahlen. Die Zeichen 19 und 16 (dezimal) sind in der Tat ein Recht weisendes Dreieck und ein Doppel-Ausrufezeichen.
Andere Tipps
Ein Newline (in Windows) ist \r\n
.