Programmiersprachen 2015 – ein Update

Der Beitrag zu den Programmiersprachen für 2015 ist schon etwas her und da passt es ganz gut, bevor der Beitrag für die Sprachen 2016 kommt, ein kleines Resumee zu ziehen.

Rückschau

Ich hatte mir für 2015 primär folgende Sprachen zurecht gelegt:

  • Python3
  • PHP
  • Nim
  • Julia
  • Javascript / Coffeescript
  • C/C++
  • Rust
  • Go

Die Dauerbrenner

Python und PHP dominieren weiterhin den Alltag. PHP primär da ich als Admin im Hosting ständig damit konfrontiert werde und das ein oder andere Script ansehen darf. In Verbindung mit der täglichen Malwarejagd sieht man noch mehr PHP und vor allem was alles damit gemacht werden kann. Ein schöner Nebeneffekt bei all der Malwarejagd ist, dass meine Regexkenntnisse innerhalb von 2 Monaten extrem gestiegen sind – ich fange langsam an in Texten Muster zu sehen und ertappe mich in und wieder bei Etiketten, Nummernfolgen nach Mustern zu suchen und zu überlegen wie man das in Regex ausdrücken könnte.

Bei Python habe ich den Sprung auf Python3 gewagt, wenn auch erst im letzten Quartal des Jahres. Ich habe extra gewartet, da ich nicht gefrustet alles in die Ecke werfen wollte, wenn irgend eine Library noch nicht portiert ist. 2015 ist in der Python Welt viel passiert und gerade die Portierung auf Python3 ist gefühlt in 2015 in Fahrt gekommen. Insgesamt finde ich das ständige Encodieren und Decodieren nervig, aber im Großen und Ganzen bin ich mit Python3 zufrieden.

Allerdings auch bei PHP ging es voran, dort ist die Version 7 erschienen. Viele neue Features. Viel zu entdecken und zum ausprobieren.

Abstellgleis

Auf dem Abstellgleis finden sich alle Sprachen die ich hin und wieder verfolge, aber aktuell nicht im näheren Umfeld habe. Sprachen brauchen auch immer ihre Zeit bis sie relevant werden und mit zu jungen Sprachen beschäftige ich mich nur in Testumgebungen. Produktive Software auf einer Sprache aufzusetzen, die noch nicht stabil und fest genug ist, macht wenig Sinn. Das Ziel ist Stuff fertig zu bekommen und nicht Bugs im Compiler zu suchen.

Go

Ich werde bis heute nicht mit der Syntax warm. Auch das Tooling hat sich nicht verbessert und so hantiert man immer noch mit Shell Vars herum um einen Workspace einzurichten. Eine IDE wie Pycharm gibt es nicht, allerdings gibt es ein Plugin von Jetbrains für Go. Ich sehe allerdings keinen Anwendungsfall wo ich nun Go brauche. Ich habe keine Mega Codebases die so lange zum Kompilieren brauchen, dass ich alles in Go portiere weil es dort schneller geht.
Auch wenn die Sprache für mich nichts werden wird, sehe ich mir gern die Vorträge und Conferences dazu an, da die Ideen und Ansätze die dort erklärt werden hörenswert sind.

Julia

Verfolge ich ebenfalls nicht mehr. Ich weiss gar nicht wie der Stand ist. Vielleicht schau ich nochmal vorbei, aber die letzte Info war, dass Julia eine Sprache für die Wissenschaftler werden soll.

Update: Ich war zwischenzeitlich wieder mal auf den Seiten von Julia unterwegs und es hat sich ordentlich was bewegt. Mittlerweile gibt es sogar ein Paket für MySQL. Ich denke ich werde mir die Sprache nochmal genauer ansehen.

Rust

Auch hier lese ich nur so halb die Neuerungen mit, habe aber keine aktuellen Projekte darin am Start. Ganz abgeschrieben wie Go habe ich die Sprache noch nicht, vielleicht wirds noch was. Aktuell aber eher nicht.

Neuankömmlinge

Ein paar Sprachen sind dann doch hängen geblieben und werden vermutlich in die Riege der Allzwecksprachen aufgenommen

Nim

Ich mag nach wie vor den Syntax. Auch das Tooling gefällt mir sehr gut. Mit nimble hat man Ruck Zuck Libraries geladen. Einige Programme habe ich damit schon umgesetzt und es war einfach nur Fun damit zu arbeiten. Bleibt da und wird weiter genutzt. Was mir ein wenig fehlt sind Libraries. Die Sprache ist das eine, aber gerade Go und auch Rust haben enorm viel Libraries am Start. Da Nim aber langsam aus den Kinderschuhen kommt (es gab sogar schon eine Nim Conference – in der Ukraine – in Russisch) denke ich wird es da bald nen Ruck geben.

Javascript / Coffeescript

Die Syntax von JS ist gruselig. In Verbindung mit JQuery reicht das als Halloween Gruseleffekt – warm werde ich damit nicht. Aber in Verbindung mit Node.JS ist das ne sehr schöne Angelegenheit. Zusammen mit Coffeescript wird auch der JS Quelltext zum Fun. Man muss allerdings beide Sprachen beherrschen denn sonst versteht man nicht was im JS Quelltext passiert und das ist bei Debugging dann doch etwas blöd.

Bleibt erst mal da aber nicht high Prio.

C/C++ – der Knaller

Obwohl ich in dem Beitrag zum Jahresanfang noch geschrieben habe, dass ich mit C/C++ nicht anfangen werde, liegen hier nun plötzlich seit einigen Wochen 3 riesen Wälzer an totem Papier zum Thema C++. Ich hätte nicht gedacht, dass ich mir das doch ansehe aber ich arbeite seit einigen Wochen daran mir den Stuff einzuverleiben. Ich denke, dass da Nim dran schuld ist. Auch schon zu Java Zeiten war mir die Typisierung sehr angenehm. Das Ducktyping in PHP, Python etc. ist zwar für Scripte praktisch aber es geht eigentlich gegen meine Art zu denken. Wenn ich über ein Programm oder Script nachdenke, dann denke ich eben in Typen / Objekten. Bei Python, PHP denkt man üblicherweise eher in Funktionen, damit man das was erledigt werden soll umsetzen kann. Die Gliederung in Objekte sieht man da nur bei großen Projekten und erfahreren Entwicklern.

Bei C/C++ gefällt mir dann vor allem wiederum, dass man in Python, PHP und andern Sprachen sich Module schreiben kann, die man dann zu Performancezwecken mit einsetzen kann. So wird die Scriptsprache zum Kleber zwischen zwei Welten.

Aufgewärmt

Ruby

Die letzte Sprache mit der ich mich nebenher beschäftige ist erneut Ruby. Ich hatte mir das in Version 1.9 angesehen und war zwar vom Syntax angetan, allerdings war es damals die Rails Sprache. Es gab so gut wie keine Gems für Ruby ohne nicht gleich auf Rails zu setzen. Aktuell habe ich das Gefühl, dass Ruby sich ein wenig von Rails losgesagt hat und mehr auf „Battieries included“ konzentriert anstatt nur an Rails zu hängen.

Aktuell spiele ich mit ein paar kleinen Sachen herum, im Rahmen von Tooling und bin nicht abgeneigt; bei Python gibt es doch ein paar kleine Sachen die nerven und Ruby macht das etwas besser. Mal sehen wie es weiter geht.

2016?

Wie es 2016 mit den Sprachen weiter geht wird sich zeigen, der Beitrag dazu wird kommen :)

De-Obfuscate PHP Malware – Want a cookie?

In my daily job, malware hunting takes a growing part. I remember times, where malware was a nightmare to me, because the detection, the understanding „how it works“ and the cleaning takes a huge amount of time, which has to be done manually. After a few months, I made this nightmare a sport. The tools I use to detect malware are handcrafted and get better from day to day, even the rules database does.

Since I am still struggling with a new purpose for my blog, one could be the deobfuscation of malware. Today I had a trick one, until I understand how it is made.

The raw code

First of all, the following code lurks in wordpresses only. Or better: I didn’t saw it somewhere else.

I removed the PHP syntax highlighting, because a terminal has none, too. The first thing to do is add some spacings and indentations for better reading.

Take it apart

The first thing I try to understand, is – how are the strings encoded or obfuscated. Sometimes it is a mixture of eval(), base64_decode(), gzinflate() or sth. else. But all these tests failed here. And I was wondering what these strings are in readable text. I took one of the strings and printed it:

Ok, PHP seems to translate this obfuscated string to _COOKIE. Hum? If you look closer you’ll see it:

There is a bitwise operator. This means we have to strings, which got combined with a XOR into a new variable. And this results in _COOKIE. Until I knew this, I could decoded the whole script to a more readable version:

Variable Games

All PHP malwares needs some common functions to do the expected work in the hosting account or like this one, the wordpress folder. In this case, they were obfuscated by XOR’ing them in two partials. But there is another part which I took a closer look:

A mediocre php programmer should understand this right away. For all the others I’ll explain it:

1. Store the string „_COOKIE“ in the variable „lgj“.

2. Create a unnamed variable of $lgj and push the reference to a new variable

This means if you do this:

You can get the content by doing this:

Changing Symbols

The arbitrary code will injected by a malicious cookie. The cookie got read by the global variable $_COOKIE. So far so good, but what’s next? Well, now the extract function takes the ropes to pull. Until the attacker stored additional data in the array with this piece of code:

Now the array is complete to change the PHP symbols table. The extract() function does this (I’m starting to shiver if I only think that a function like this exists…). First of all let me shortly explain what extract() does:

In this case we have an array, containing a key „b64e“ which has a value „base64_encode“. With extract() we extract (who couldn’t belive…) the key and the value, generate a new variable $b64e with the value base64_decode. Since the value of the new variable b64e is a function, it acts as a function and it’s possible to encode a little string to base64. This method of obfuscation is necessary to hide the real function names from keyword scanners. Even regex scanners may struggle with it.

The rest of the malware is pretty simple. After a small check with md5 (the md5 validation string is shipped in the malware) to ensure the delivered arbitrary code is correkt, it got executed and does its work within the infected malware.

The end and conclusion

It is not highly clever but needs at least a small moment to thing about what it is doing. There are better ones I will explain soon. What more to say? Happy hackin‘

PS: I hope Google won’t detect this as malicious code and block my blog from indexing…

Post Streik – stört das jemanden?

DeutschePost_Briefe

Seit einigen Tagen streiken die Mitarbeiter der Deutschen Post. Der Grund ist, vereinfacht dargestellt, dass es darum geht, dass die Deutsche Post AG einen Schwung neue Gesellschaften gegründet hat in die bestehende aber auch neue Mitarbeiter umgesiedelt werden sollen. Das ist erst mal nicht weiter tragisch, der spannende Part ist eher, dass damit Geld gespart werden soll, denn die Löhne die in den Regionalgesellschaften gezahlt werden sollen deutlich unter dem Haustarif liegen. Das dort nun gestreikt wird, ist ihr gutes Recht. Darum geht es mir in diesem Blogbeitrag aber gar nicht. Continue reading…

vmware with debian stretch – libcurl problem

Prelude
It seems this is not the first time of vmware and libcurl problems:

I’m using vmware workstation for private and job based tasks. The version 10.0.6 works flawlessly but after I updated to version 11.1.0 the program keeps crashing. The crashes happens not with the vmx, but the gui disappears silently. In the logs you’ll see similiar backtraces:

The problem is caused by the libcurl library. Debian stretch uses a too new version of the library (version: 7.42.1). It seems that the gui does some background tasks, which uses the libcurl interface. There are two possible ways of fixing this problem:

1) downgrade and hold the old packages

Install downloaded packages

set packages to hold with aptitude

verify hold status

2) use library from /usr/lib/vmware/lib/ directory

vmware shipps own library versions which are located in /usr/lib/vmware/lib/. With LD_LIBRARY_PATH is it possible to load the right library version in front of starting the main program. I recommend to change the vmware / vmplayer scripts.

Diff for vmplayer

Diff for vmware

I hope vmware will fix this in the near future.

Programmiersprachen für 2015

Bisher habe ich mich primär mit PHP und Python (und früher auch mit Java) auseinandergesetzt. Doch bei der Fülle an Programmiersprachen die es gibt, ist es an der Zeit über den Tellerrand zu schauen. Die Zeiten, dass man nur eine Sprache beherrscht und die dafür perfekt sind schon länger vorbei und so rückt das polyglotte Entwickeln näher. Da ich schon immer einen Faible für verschiedene Sprachen hatte, habe ich mir für dieses Jahr mal ein paar aufgeschrieben:

Aktuelle Sprachen

Ich beschäftige mich im ersten Teil der Artikelserie erst einmal mit Äußerlichkeiten. Daher nicht gleich die Kommentare fluten wenn ich mich hier nun erst einmal über Äußerlichkeiten wie Syntax, Transcompile Fähigkeiten etc. auslasse. In erster Linie muss ich als Entwickler die Sprache mögen. Was nützt es mir wenn ich jeden Tag mit einer Sprache arbeite die mich nicht anspricht oder flüssig aus der Hand geht. Da kann die Sprache noch so performant und toll sein, wenn man keinen Zugang zu ihr hat, wird man nie in die Tiefe kommen wie jemand der mit Leidenschaft die Sprache verwendet. Entwickeln ist für mich nicht nur „get the shit done“ sondern eher ein kreativer Akt. Und so wie es Künstler gibt die eben nur Klavier, Geige oder mit Ölfarben hantieren, so habe ich mein Set an Sprachen die ich gern verwende – dafür aber intensiv. Continue reading…

Wenn Rechte Recht sprechen sollen

Es mag durch aus sein, dass jeder eine zweite Chance verdient hat, das will ich nicht in Abrede stellen. Jedoch sollte man genau prüfen wo er diese zweite Chance erhält. Laut einem Bericht der fränkischen Online-Gazette „Main-Netz“ (dank Leistungsschutzrecht verzichte ich hier auf jegliche Verlinkung oder Wiedergabe eine Ausschnitts) soll ein ehemaliger Frontmann der Band „Hassgesang“ die in Berlin ihre vergifteten Kehlen an die Mikrofone hielt, in Lichtenfels (Oberfranken) eine neue Change bekommen. Der neu angehende Zivilrichter soll in Zukunft Ehen und Sorgerechtssachen bearbeiten.

Das bayrische Justizministerium hat wohl von der Sache schon Wind bekommen (obwohl die bayrischen Justiziare immer etwas länger brauchen (siehe Mollath)) und möchte dazu aber keine weitere Stellung beziehen. Man verwies lediglich darauf, dass es neben einer Probezeit wohl auch Prüfungen hinsichtlich der Verfassungstreue geben soll.

Meiner Meinung nach hat sowas in einem Gerichtssaal nichts verloren. Selbst wenn er die Prüfungen und Probezeiten besteht, so ist nicht auszuschließen, dass wenn die Beobachtung abnimmt ein Urteil plötzlich 88 mal unterschrieben wird.