2009-04-21 9 views
6

Als eine Zuweisung für eine Sicherheitsklasse versuche ich __asm__("jmp 0xbffff994"); in meinem Code zu verwenden, aber wenn ich Dinge in gdb zerlege, wird die Anweisung zu jmp 0xc8047e2a geändert. Irgendeine Idee warum und wie kann ich zu einer bestimmten Adresse springen?x86 zu einer Adresse springen

+2

Warum zum Teufel müssen Sie zu einer rohen Adresse springen? Mir fällt es schwer, irgendeinen möglichen (nicht ruchlosen) Gebrauch dafür zu verstehen. – kquinn

+0

Welches System verwenden Sie? –

+5

@kquinn unabhängig, seine Frage wurde gestellt, lassen Sie uns versuchen, sie zu beantworten. – samoz

Antwort

18

Wahrscheinlich, weil es ein Sprung zu einer relativen Adresse ist, und der Linker oder Lader hat Ihren Code verschoben. Versuchen Sie, die Adresse in eine Variable setzen, und dann tun:

jmp dword [var] 

oder alternativ:

push 0xbffff994 
ret 
+5

* das * ist die richtige Antwort, beachte auch, dass: "mov eax, 0x11223344; jmp eax"; wird auch funktionieren und ist wahrscheinlich am einfachsten. –

+1

sehr wahr, aber er könnte fastcall (ich bin mir nicht sicher über die Bedeutung von 0xbffff994). – Mark

+0

Die PUSH RET-Kombination funktioniert! Vielen Dank! – Martin

0

Daniel Erklärt, warum Ihr Sprung nicht der gleiche ist, den Sie programmiert haben. Es hat mit Objektdateien und Verknüpfungen zu tun.

Wenn Sie zu einer bestimmten Adresse springen möchten, ist es am besten, den Sprung mit einem Debugger oder Disassembler zu patchen.

0

Auf meinem System (gcc Version 4.2.4, Ubuntu) diese auf der disassmbley gut aussieht (Einblick) :

 
int main() 
{ 
asm("jmp 0xbffff994"); 
return 0; 
};  

Ergebnisse der disassmbley (Einblick):

 
     0x8048344  :     lea 0x4(%esp),%ecx 
-  0x8048348  :    and $0xfffffff0,%esp 
-  0x804834b  :    pushl -0x4(%ecx) 
-  0x804834e  :    push %ebp 
-  0x804834f  :    mov %esp,%ebp 
-  0x8048351  :    push %ecx 
-  0x8048352  :    jmp 0xbffff994 
-  0x8048357  :    mov $0x0,%eax 
-  0x804835c  :    pop %ecx 
-  0x804835d  :    pop %ebp 
-  0x804835e  :    lea -0x4(%ecx),%esp 
-  0x8048361  :    ret 
+0

Ich würde vermuten, dass dieser Disassembler den Offset des JMP und nicht sein tatsächliches Ziel zeigt. (Die jmp-Anweisung nimmt einen Offset relativ zu eip an, wenn Sie ihr einen 32-Bit-Sofortoperanden geben). –

+0

Warum schätzen Sie das? Gibt es eine Möglichkeit, es zu testen? Es läuft als grafische Benutzeroberfläche mit GDB unten. –

+0

Oder es könnte sein, dass es keine Verlagerung gibt. Wenn Sie jedoch die Opcodes mit der Baugruppe ausgeben, können Sie den Offset sehen. – Mark

0

Es ist schwierig, die genaue Adresse nach der Kompilierzeit zu ermitteln. Haben Sie versucht, Etiketten zu verwenden? Es ist viel häufiger, sie mit jmp zu verwenden.

Beispiel:

start: 
jmp exit 

exit: 
ret 
0

Ich würde empfehlen, einen Hex-Editor verwenden und einfach den Wert zu ändern, wenn es nur eine einmalige Sache.