Wann wird ein String in eine Adresse geschrieben?

10/10/2011 - 14:29 von Thomas Wildgruber | Report spam
Hi Group,

Anfàngerfrage: Ich habe ein kleines C-Programm mit gdb deassembliert und
konnte dem ganzen Programmablauf folgen, wobei aber noch ein Fragezeichen
stehen geblieben ist.

Das C-Programm:

snip
#include <stdio.h>

int main()
{
int i;
for(i=0; i < 10; i++)
{
printf("Hello, World!");
}
return 0;
}
snap

Der auf einer x86 Intel CPU deassemblierte Code schaut folgendermaßen aus:

snip
(gdb) disassemble main
Dump of assembler code for function main:
0x080483b4 <+0>: push ebp
0x080483b5 <+1>: mov ebp,esp
0x080483b7 <+3>: and esp,0xfffffff0
0x080483ba <+6>: sub esp,0x20
0x080483bd <+9>: mov DWORD PTR [esp+0x1c],0x0
0x080483c5 <+17>: jmp 0x80483d8 <main+36>
0x080483c7 <+19>: mov DWORD PTR [esp],0x80484b0
0x080483ce <+26>: call 0x80482f0 <puts@plt>
0x080483d3 <+31>: add DWORD PTR [esp+0x1c],0x1
0x080483d8 <+36>: cmp DWORD PTR [esp+0x1c],0x9
0x080483dd <+41>: jle 0x80483c7 <main+19>
0x080483df <+43>: leave
0x080483e0 <+44>: ret
End of assembler dump.
snap

Was mich stört ist die mov-Instruktion an Adresse 0x080483c7 <+19>:
mov DWORD PTR [esp],0x80484b0

Hier wird der Inhalt der Adresse 0x80484b0 ins ESP Register geschrieben,
eine Analyse der Quelladresse ergab, dass dort der String "Hello, World!"
steht. Meine Frage ist nun, wie und wann kommt der String da an diese
Stelle? Letztlich wird ja bei der ersten mov-Instruktion (mov DWORD PTR
[esp+0x1c],0x0) ja auch explizit der Wert 0x0 in die Adresse [esp+0x1c]
geschrieben, was die Variable i initialisiert.

Ich habe den Inhalt dieser Adresse auch schon unmittelbar nach dem Start
von gdb (natürlich mit dem Programm als Argument) analysiert aber der
String steht da schon drin, noch bevor ich in gdb das eigentliche Programm
mit run gestartet habe oder sonst eine Operation durchgeführt habe.

Welche hellseherischen Kràfte sind da am Werk die wissen, dass in diese
Adresse ein String geschrieben werden soll?

Sorry für die Newbiefrage aber hàtte ich das geklàrt, hàtte ich den ganzen
Zenober verstanden, was mir schon recht wàre... ;-)

Thx & Bye Tom
"Manches Gewissen ist nur rein, weil es nie benutzt wurde" (Robert Lembke)
 

Lesen sie die antworten

#1 Stefan Reuther
10/10/2011 - 18:45 | Warnen spam
Thomas Wildgruber wrote:
Anfàngerfrage: Ich habe ein kleines C-Programm mit gdb deassembliert und
konnte dem ganzen Programmablauf folgen, wobei aber noch ein Fragezeichen
stehen geblieben ist.

Das C-Programm:


[Hello, World]
Ich habe den Inhalt dieser Adresse auch schon unmittelbar nach dem Start
von gdb (natürlich mit dem Programm als Argument) analysiert aber der
String steht da schon drin, noch bevor ich in gdb das eigentliche Programm
mit run gestartet habe oder sonst eine Operation durchgeführt habe.



Das macht der Lader. Der Assembler in Verbindung mit dem Linker
schreiben den String in die Programmdatei, und der Lader làdt das dann
in den Speicher. Genauso, wie er den Code deiner main-Funktion an
0x080483b4 geladen hat, hat er den String an 0x80484b0 geladen.

Wenn du wissen willst, wie man das in einem Assemblerprogramm notiert,
schau dir den Assemblercode an, den der Compiler erzeugt ('gcc -S'),
nicht das Disassemblat.

(Es wird übrigens nicht "der Inhalt der Adresse 0x80484b0 ins ESP
Register geschrieben", sondern "0x80484b0 an die Adresse geschrieben,
die im ESP-Register steht". Feiner Unterschied.)


Stefan

Ähnliche fragen