Archive for the 'Assembler' Category

Code rückwärts

Hin und wieder flammt in mir das Interesse auf, mich an sogenannten CrackMes zu versuchen. Im Grunde bedeutet das, dass ich das Programm durch einen Debugger wie OllyDbg schicke und interessante Stellen im (Assember-)Code suche, um an das einzugebende Passwort zu kommen.

Das Material zum cracken finde ich in der umfangreichen Sammlung von Crackmes.de. Allerdings bewege ich mich noch auf dem Beginner-Level, da meine Assembler-Kenntnisse eher rudimentär ausgeprägt sind.

Und so ist auch heute fast der ganze Tag drauf gegangen, dieses hier zu bearbeiten. Allerdings kam ich allein nicht wirklich weiter, so dass ich mich mit einem als Lösung eingereichtem Tutorial behelfen musste. Die Benutzung dieses Tutorials empfand ich aus persönlicher Sicht niederschmetternd, da ich die Lösung nicht allein hinbekommen habe. Ich bin eben nicht der Typ, der sich bei einfachen Problemen helfen lässt. Zu dem war der innerliche Druck da, endlich eine Lösung zu haben.

Was Virenscanner über meine Programme denken

Da um die Zeit eh nichts Vernünftiges im Fernsehen läuft, vertreibe ich mir die Zeit mit dem Online-Virenscanner Virustotal.com. Zwar hab ich keine Virendatei im Angebot, doch da wären ja noch einige meiner zusammen gehackten Programme.

Einen passenden Testkandidaten hatte ich schnell parat: Zeichen.out

Das Programm kann an sich nicht viel – einen im Quelltext angegebenen Text ausgeben. Dafür ist es in Assembler geschrieben, was wohl den Virenscanner etwas stutzig gemacht hatte.
Gleich vier Virenscanner (Virustotal prüft mit mehreren Scannern) nahmen an, dass man meinem Programm nicht über den Weg trauen könne.

Das Ergebnis war dann dieses:

  • AntiVir -> HEUR/ELF.Malformed
  • Authentium -> Heuristic-90
  • F-Prot -> Heuristic-90
  • Webwasher-Gateway -> Heuristic.ELF.Malformed

Das sind zwar nur 4 von 36 Scannern die anschlugen, aber es war ein durchaus amüsantes Ergebnis.
Zum Schluss noch den Code (für Linux mit nasm), falls sich jemand dafür interessiert:

section .code
global _start
 
_start:
mov edx, len
mov ecx, txt
mov ebx, 1
mov eax, 4
int 0x80
 
mov ebx,0	;; Windows only
mov eax,1	;; mov ah, 4Ch
int 0x80	;; int 21h
 
section .data
txt db 'Kampfdackel',0x0A
len equ $ - txt

Assembler – Tag

Heute hatte ich irgendwie Lust, mal was in Assembler zu programmieren. Vielleicht kommt es daher, dass ich im Zug viel im Assemblerbuch geschmöckert habe, aber keinen Laptop mit dabei hatte.
Bei Assembler befinde ich mich noch am Anfang. Daher habe ich auch nicht wirklich tolle Sachen zum darbieten.

Hier mal eines meiner Progrämmchen:

org 100h
section .code
	mov ch, 0
	mov cl, 1
anfang:
	cmp cx, 6
	je weiter
	add cx, 2
	cmp cx, 6
	ja korrigieren
zurueck:
	mov dx, msg
	mov ah, 9h
	int 21h
	jmp anfang
korrigieren:
	dec cx
	jmp zurueck
weiter:
	mov dx, schluss
	mov ah, 9h
	int 21h
	mov ah, 4Ch
	int 21h
 
section .data
msg db 'Froehliches Inkrementieren!',0Dh,0Ah,'$'
schluss db 'Fuer heute ist Schluss!',0Dh,0Ah,'$'

Ist zwar nicht wirklich spektakulär, aber immerhin funktioniert es. Damit habe ich die Befehle für den bedingten und unbedingten Sprung geübt und Schleifenkonstrukte in Assembler nachgestellt.

Erste Gehversuche in Assembler

Jetzt habe ich schon so reichlich Literatur zum Thema Assembler, da muss ich doch auch mal anfangen, was zu programmieren. Dazu hab ich mir dann den NASM Assembler besorgt.

Erst mal ein Beispielprogramm (es war tatsächlich ein “Hallo Welt”-Programm :) ) angesehen und dann eigene Experimente gemacht, die dann darin endeten, dass sich das Programm aufgehängt hat :°( .

Bisher weiß ich nur, wie man einen Text, der in einer Variable gespeichert ist, ausgibt. Mein jetziger Versuch ist es nun, ein Programm zu schreiben, was zwei Zahlen addiert und das Ergebnis ausgibt. (Ich schäme mich ein wenig :? , aber bei Assembler muss man wirklich klein anfangen).

An Assembler gescheitert

…bin ich, als ich versuchen wollte die in Delphi vorhandene roundTo Funktion nach Java zu portieren. Mal wieder hatte ich mit einer neueren Version des DVD-Verwaltungsprogramms zu kämpfen :x . Ich wollte eine Fließkommazahl (für die Insider: der verwendete Datentyp war float) auf zwei Nachkommastellen runden. Da saß ich nun mal, ohne irgendeine Idee, wie ich das zu Rande bringen sollte, ohne gegen diverse Vorschriften der Professoren zu verstoßen. Vergeblich habe ich in der Java-Bibliothek gesucht, ob’s so was wie roundTo gibt. Hab aber nix gefunden.

Also dachte ich mir: guck doch mal in der Delphi-Bibliothek nach, immerhin hast du Pascal als Programmiersprache gelernt. So ging dann auch dort die Suche los. Ich wurde auch fündig und alles sah zunächst ja auch einfach aus, denn der Quelltext stand im verständlichen Pascal da. Doch in der Funktion wurde eine weitere Funktion aufgerufen, so dass ich dann gezwungen war, die Implementierung dieser Funktion (namens intPower) zu suchen.

Doch dann fand ich mich inmitten von etlichen Assemblerbefehlen wieder und mein Verständnis ging rasch gegen Null :( . Zu gering war mein Wissen über die verschiedenen Befehle, von denen ich noch nie etwas gehört hatte.

Aber, es besteht Möglichkeit zur Behebung dieser Sprachbarriere: ich habe exklusiven Zugang zu einem Assembler-Buch (dank meines Lieblingsinformatiklehrers).