Warum wird diese Speicher-Adresse %fs:0x28 ( fs[0x28] ) haben einen zufälligen Wert?
Ich geschrieben habe, ein Stück C-code und ich habe ihn zerlegt, sowie Lesen Sie die Register, um zu verstehen, wie das Programm arbeitet in der Montage.
int test(char *this){
char sum_buf[6];
strncpy(sum_buf,this,32);
return 0;
}
Dem Stück von meinem code, den ich habe untersuchen, ist der test-Funktion. Wenn ich zerlegen das Ergebnis meiner test-Funktion habe ich bekommen ...
0x00000000004005c0 <+12>: mov %fs:0x28,%rax
=> 0x00000000004005c9 <+21>: mov %rax,-0x8(%rbp)
... stuff ..
0x00000000004005f0 <+60>: xor %fs:0x28,%rdx
0x00000000004005f9 <+69>: je 0x400600 <test+76>
0x00000000004005fb <+71>: callq 0x4004a0 <__stack_chk_fail@plt>
0x0000000000400600 <+76>: leaveq
0x0000000000400601 <+77>: retq
Was ich gerne wissen würde ist, was mov %fs:0x28,%rax
ist wirklich tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
X86_64, segmentierte Adressierung wird nicht mehr verwendet, aber die beiden die
FS
undGS
- Register kann verwendet werden als base-pointer-Adressen verwenden, um Zugriff auf spezielle Betriebssystem-Datenstrukturen. Also, was Sie sehen, ist ein Wert geladen, bei einem offset von dem Wert gehalten, der in derFS
registrieren, und nicht bit manipulation der Inhalte derFS
registrieren.Speziell was stattfindet, ist, dass
FS:0x28
auf Linux ist die Speicherung einer speziellen sentinel-stack-guard-Wert, und der code ist die Durchführung einer stack-guard-check. Zum Beispiel, wenn Sie sich weiter in Ihrem code, Sie werden sehen, dass der Wert anFS:0x28
wird auf dem stack gespeichert werden, und dann wird der Inhalt des Stacks geladen und einXOR
erfolgt mit den original-Wert beiFS:0x28
. Wenn die beiden Werte gleich sind, was bedeutet, dass das null-bit gesetzt wurde, weilXOR
'ing, zwei gleiche Werte ergibt, die in einen null-Wert, dann springen wir zu dentest
routine, sonst springen wir zu einer speziellen Funktion, die angibt, dass der Stapel war irgendwie beschädigt, und die sentinel-Wert auf dem stack gespeichert werden geändert wurde.Wenn Sie GCC verwenden, dies kann deaktiviert werden
Blick auf http://www.imada.sdu.dk/Courses/DM18/Litteratur/IntelnATT.htm, ich denke
%fs:28
ist eigentlich ein offset von 28 bytes ab Adresse in%fs
. Also ich denke, es ist das laden eines vollständigen Registers der Größe von Lage%fs + 28
in %rax.fs
ist keine "normale" registrieren. Es ist ein segment-register. Im geschützten Modusfs
ist ein selector in der GDT. Es gibt versteckte "Basis" und "limit" - Register zugeordnet, dass Sie nicht sehen können. Sofs:0x28
ist wirklich[hidden_fs_base + 0x28]
.