MIPS-Assembler Buffer Overflow < Assembler < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) überfällig | Datum: | 10:53 Mo 11.05.2009 | Autor: | RalU |
Aufgabe | Hallo, ich bin Assembler-Neuling und habe folgenden MIPS-Assembler-Code vorliegen, bei dem es um das Problem des Buffer Overflows geht. (5 Bytes auf Stack reservieren)
Es soll dabei im Prinzip folgende c-Funktion umgesetzt werden:
void problem()
{
char arr[5];
strcpy(arr, getdata(...));
...
}
hier der MIPS-Assembler-Code (für SPIM angepasst)::
.data
out_string: .asciiz "HACKED"
.text
main:
addi $sp,$sp,-4 # $ra retten
sw $ra,0($sp)
li $a0,0x10000003 # manipul. Eing. ab Adr. $a0=0x10000003
li $t0,0x65
sb $t0,0($a0)
sb $t0,0($a0)
sb $t0,1($a0)
sb $t0,2($a0)
sb $t0,3($a0)
sb $t0,4($a0)
sb $t0,HACKED
la &t0, 5($a0)
sb $zero,9($a0) # src ist jetz [mm] "xxxx(Addr(Hacked))\0"
[/mm]
addi $sp,$sp,-5 #platz für [mm] "xxxx\0" [/mm] auf Stack schaffen
move $a1, $sp # $a1=dest auf sp setzen
jal STRCPY # aufruf der Funktion strcpy(src,dst)
addi $sp,$sp,5 #5 Bytes vom Stack nehmen
lw $ra,0($sp) # $ra zurückschreiben
addi $sp, $sp, 4
jr $ra
strcpy: # src[] in $a0, dest[] in $a1
addi $t3, $zero, 0 # $t3 mit 0 initialisieren
add $t0, $t3, $a0 # adr. von src[i] ber. und in $t0 ableg.
add $t1, $t3, $a1 # das gleiche mit dest[i]
lb $t2, 0($t0) # src[i] in $t2 laden
sb $t2, 0($t1) dest[i]=$t2=src[i]
beq $t2, $zero, ret # falls 0 ende der schleife
addi $t3, $t3, 1 # i++
j loop
ret:
jr $ra # rücksprung
hacked:
la $v0, out_string # Böser code irgendwo im speicher
li $v0, 4
syscall
li $v0, 0
syscall
|
1. Frage: Was ist eigentlich genau das Problem, 4 Bytes auf dem Stack zu reservieren? Etwa die Beschränkung in MIPS-Assembler auf 4 Bytes?
2. Frage: Warum muss auch am Ende von main: "jr $ra" folgen? Ist dies nicht nur beim Verlassen von Prozeduren, also Unterprogrammen notwendig?
3. Frage: Der Aufruf von "strcpy" ist mir nicht ganz klar. Wo genau werden die beiden Argumente übergeben und welche Werte haben sie bei der Übergabe?
4. Was genau passiert in "hacked:" Es wird dort ein String als .asciiz-Format mit la (load address) in das Register $a0 geladen. Dann gebe ich diesen String auf der Konsole aus. Und was bewirken dann noch die letzen beiden Zeilen in "hacked:"? Was bringt das insgesamt?
Vielen Dank für Eure Hilfe,
Ralf
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:20 Mi 13.05.2009 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|