Programmieren

alea iacta est – Teil 3

Posted in Programmieren, Wettbewerb on August 19th, 2010 by Patrick – 30 Comments

Fortsetzung zu alea iacta est – Teil 1 und alea iacta est – Teil 2

So nun geht es in die dritte Runde!
Mein Bot ist fertig und hat bereits die ersten Testläufe absolviert. Begonnen habe ich auf dem offiziellen Server, doch dummerweise ist dieser mehr als nur langsam. So kann es da problemlos mal vorkommen, dass man 15 Minuten auf ein neues Spiel wartet.
Doch glücklicherweise hat ein findiger Mitstreiter eine in Ruby implementierte Serverkopie geschrieben und veröffentlicht. Damit können problemlos 10 Spiele pro Minute gespielt werden und ist somit für Tests viel besser geeignet.
Erreichbar ist dieser Server unter:

1
telnet littleforumpeople.com 3333

Mein Bot selbst hat sich eine bereits eine nicht allzuschlechte Statistik erarbeitet:

Gewonnen: 2258
Verloren: 1542
Spiele: 3800

Daraus ergibt sich eine Erfolgsquote von ganzen 59.4%, wodurch er problemlos mit den Besten mithalten kann :)

Der Bot selbst ist relativ einfach aufgebaut:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/bin/bash
#------------------------------------------------------------------------------
# Author:	Patrick Schmid
# Web:		http://blog.encodingit.ch
# Version:	1.1
# Changes:	- Grundversion (13.8.10)
#		- Script umgestellt auf NC-Version (16.8.10)
#------------------------------------------------------------------------------
 
# Umgebung festlegen
name="encodingit" # mein Name
active=0 # Nicht mein Zug
zaehler=0
 
function play { # Spielfunktion
 
	# Dies müsst ihr selbst machen ;)
 
}
 
while read command a1 a2 a3
do
	case $command in
		HELO)
			echo "AUTH $name Ich bin bereit!"
			;;
		TURN)
			play $a1 $a2
			;;
		THRW)
			if [ "$active" = "1" ] 
			then
				if [ "$a1" = "6" ]
				then
					active=0
				fi
			else
				if [ "$a1" = "6" ]
				then
					active=1
				fi
			fi
			;;
		WIN|DEF)
			echo "$command" >> log
			exit 0
			;;
		*)
			echo "AUTH $name Ich bin bereit!"
			;;
	esac
done

Ich denke ihr werdet verstehen, dass ich die Play-Funktion erst nach dem Abgabetermin veröffentliche.
Gestartet wird das Script via netcat oder ncat:

1
sudo ncat -v -e ./wettbewerb.sh littleforumpeople.com 3333

Ich wünsche euch viel Spass beim würfeln. :)

alea iacta est – Teil 2

Posted in Programmieren, Wettbewerb on August 17th, 2010 by Patrick – 7 Comments

Fortsetzung zu alea iacta est – Teil 1

Mein Bot ist nun soweit geschrieben und mit Intelligenz gefüllt. Was ihm nun noch fehlt, sind ein paar Tests, danach werde ich (zumindest Auszüge daraus) auch hier veröffentlichen.

Doch noch ein paar Worte zu meinem Vorgehen:
Eigentlich wollte ich die Kommunikation von Script zu Server via dem virtuellen Device /dev/tcp abwickeln. Schon relativ früh zeigte sicher aber; das ist so nicht lösbar!
Das Problem dabei ist, dass sobald irgendetwas auf den Device umgeleitet wird, wird die TCP-Verbindung neu aufgebaut und nach dem Senden auch gleich wieder getrennt. Geplant ist aber, dass die Verbindung nur einmal hergestellt und dann natürlich auch gehalten wird…

Somit musste ich kurzerhand umdisponieren und bin auf eine andere Möglichkeit mittels Netcat ausgewichen. Dabei wird, wie hier schon zu lesen war, mittels der Option -e nach dem Verbinden ein Script gestartet. Die Kommunikation verläuft dabei über die Standard-Ein- und -Ausgabe. Jegliche Teile der Verbindung werden von Netcat geregelt, wodurch ich mich voll und ganz auf die KI konzentrieren kann.

Doch nun zum Wichtigsten: Die Strategie!
Ich habe in ein paar kurzen, manuellen Spielen ein paar Taktiken ausprobiert. Zur Zeit umgesetzt sind:

  1. Liege ich im Rückstand, muss ich risikofreudiger werden.
  2. Liege ich weit vorne, kann ich sicherer spielen.
  3. Speichert mein Gegner selten, kann ich sicherer spielen

Doch irgendwie reicht mir das noch nicht aus für meinen Bot.
Wenn also jemand noch weitere Ideen hat, dann immer her damit :) Jeder Input ist willkommen!

alea iacta est

Posted in Programmieren, Wettbewerb on August 16th, 2010 by Patrick – 6 Comments

Auch dieses Jahr wieder macht das Linux-Magazin einen Programmierwettbewerb. Diesmal ist ein binärer Spieler gefordert, welcher sich in einem Würfelduell mit anderen Mitstreitern messen kann.

Die Vorgaben dabei sind ganz einfach; der Bot muss schlussendlich mit einem Make-File gestartet werden können und auf einem Ubuntu 10.04 Rechner laufen. Insofern kann die Programmiersprache also fast frei gewählt werden. Der Spielablauf wird dabei vom Server wettbewerb.linux-magazin.de über ein für menschen-lesbares TCP-Protokoll gesteuert.

Das ganze Spiel an sich ist relativ einfach gehalten. Ein Bot kann solange Würfeln, wie er keine 6 wirft oder das Spiel nicht speichert. Alle Punkte werden dabei immer zusammengezählt.
Sobald jedoch eine 6 geworfen wird, so werden alle Punkte bis zum letzten Save wieder abgezogen, und der Spielzug ist beendet.
Es gilt also, seinem Bot soviel Intelligenz einzuhauchen, damit dieser das optimale Mittelmass zwischen “Roll” (würfeln) und “Save” (speichern) findet.

Meinen Bot habe ich in Bash-Script begonnen und bin bislang damit ganz gut gefahren, da es sich über ein virtuelles Device ohne viel Programmieraufwand problemlos via TCP mit einem beliebigen Server kommunizieren lässt:

1
echo "alea iacta est" > /dev/tcp/$server/$port

Wer es noch einfacher will, und sich überhaupt nicht um jegliche Kommunikation zwischen Server und Bot bemühen will, der kann sein Script via Netcat starten und alle Kommandos über die Standard-Ein- und Ausgabe verwalten:

1
nc -e bot.sh wettbewerb.linux-magazin.de 3333

Auch wer auf etwas komplexeres Zurückgreifen will, der findet auf der offiziellen Webseite bereits Beispiele in PHP und Ruby, welche man nur noch mit Intelligenz füllen muss.

Ein weiteres sehr gutes PHP-Beispiel gibt es auch auf blog.oncode.info, dank welcher Seite ich überhaupt auf den Wettbewerb aufmerksam geworden bin.

Noch bis zum 12. September ist das Spiel für jedermann und jedefrau geöffnet! Mögen die Würfel entscheiden ;)

Google Code University’s Jarlsberg

Posted in Programmieren, Security on Mai 7th, 2010 by Patrick – 2 Comments

Nein, Google versucht sich noch nicht als Käsehersteller! ;)
Unter dem Codewort Jarlsberg führt die Google Code University ein Projekt zum Thema Schulung in Sicherheit für Webapplikationen.

This codelab shows how web application vulnerabilities can be exploited and how to defend against these attacks. The best way to learn things is by doing, so you’ll get a chance to do some real penetration testing, actually exploiting a real application.

Für alle die, welche dem Englisch nicht so mächtig sind: Jarlsberg ist eine Webapplikation von Google zum Thema Web Application Security. Basierend auf Python wird jedem Benutzer in einer eigenen Session eine Webseite präsentiert voll mit Sicherheitslücken von XSS über DOS bis hin zu XSRF und Path Traversal.

Neben dieser Webseite gibt es auch noch eine sehr ausführliche und gut erklärte Dokumentation zu jedem Exploit mit einer Erklärung wie man diesen auch beheben könnte (verfasst in Englisch).
Nachdem ich die Dokumentation nun mal komplett durchgearbeitet habe, muss ich sagen, es lohnt sich wirklich die 5 Seiten komplett zu lesen!
Jedoch muss ich auch sagen, in meinen Augen sind ein paar der vorgestellten Exploits ein wenig Realitätsfremd, da man z.B bei einem Pentest nur sehr wenig direkten Zugang zum Sourcecode hat.

Nichts desto trotz, wer es selbst mal ausprobieren will, und das kann ich wirklich jedem empfehlen, der klickt nun hier:

Learn how to make web apps more secure. Do the Jarlsberg codelab.