2009-04-21 7 views
6

Jako zadanie dla klasy bezpieczeństwa, próbuję użyć w moim kodzie __asm__("jmp 0xbffff994");, ale kiedy demontuję rzeczy w gdb, instrukcja jest zmieniana na jmp 0xc8047e2a. Każdy pomysł, dlaczego i jak mogę przeskoczyć na konkretny adres?x86 przeskoczyć pod adres

+2

Dlaczego do cholery potrzebujesz przejść do surowego adresu? Mam trudności ze zrozumieniem wszelkich możliwych (nie-nikczemnych) zastosowań do tego. – kquinn

+0

Jakiego systemu używasz? –

+5

@kquinn niezależnie, jego pytanie zostało zadane, spróbujmy na nie odpowiedzieć. – samoz

Odpowiedz

18

Prawdopodobnie dlatego, że jest to przeskok do względnego adresu, a linker lub program ładujący przeniósł kod. Spróbuj umieścić adres do zmiennej, a następnie wykonaj:

jmp dword [var] 

lub alternatywnie:

push 0xbffff994 
ret 
+5

* że * jest poprawną odpowiedzią, zauważ również, że: "mov eax, 0x11223344; jmp eax"; również będzie działał i najprawdopodobniej będzie najprostszy. –

+1

bardzo prawdziwe, ale on może używać fastcall (nie jestem pewien znaczenia 0xbffff994). – Mark

+0

Połączenie PUSH RET działa! Dziękuję Ci! – Martin

0

Daniel Wyjaśnia, dlaczego twój skok nie jest taki sam, jak zaprogramowałeś. Ma to związek z plikami obiektów i łączeniem.

Jeśli chcesz przeskoczyć na konkretny adres, najlepiej załatać skok za pomocą Debuggera lub Disassemblera.

0

W moim systemie (gcc w wersji 4.2.4, Ubuntu) wygląda to dobrze na disassmbley (wglądu) :

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

wyniki disassmbley (wgląd):

 
     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

Przypuszczam, że ten disasembler pokazuje przesunięcie jmp, a nie jego rzeczywisty cel. (Instrukcja jmp przyjmuje offset względem eip, gdy nadamy mu 32-bitowy operand natychmiastowy). –

+0

Dlaczego tak zgadliście? czy istnieje sposób na sprawdzenie tego? działa jako interfejs graficzny z GDB poniżej. –

+0

Albo może być tak, że nie ma przeniesienia. Jednak po zrzuceniu kodów opcodes przy użyciu zespołu można zobaczyć przesunięcie. – Mark

0

Trudno jest określić dokładny adres podczas kompilacji, czy próbowałeś używać etykiet? O wiele częściej używa się ich z jmp.

przykład:

start: 
jmp exit 

exit: 
ret 
0

Polecam przy użyciu edytora hex i po prostu zmieniając wartość, jeśli jest to tylko sprawa jednorazowa.