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
Odpowiedz
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
* że * jest poprawną odpowiedzią, zauważ również, że: "mov eax, 0x11223344; jmp eax"; również będzie działał i najprawdopodobniej będzie najprostszy. –
bardzo prawdziwe, ale on może używać fastcall (nie jestem pewien znaczenia 0xbffff994). – Mark
Połączenie PUSH RET działa! Dziękuję Ci! – Martin
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.
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
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). –
Dlaczego tak zgadliście? czy istnieje sposób na sprawdzenie tego? działa jako interfejs graficzny z GDB poniżej. –
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
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
Polecam przy użyciu edytora hex i po prostu zmieniając wartość, jeśli jest to tylko sprawa jednorazowa.
- 1. Możliwe pułapki zapisu na adres (x86 - linux)
- 2. Mapowanie pomostu ResourceHandler pod adres URL
- 3. Jak uzyskać adres IPv6 interfejsu pod Linuksem
- 4. uzyskać fizyczny adres bufora pod Linuksem
- 5. Uruchomienie programu WinForm 10x wolniej pod x64 względem x86
- 6. Jak przeskoczyć górę pliku w PhpStorm?
- 7. x86/x64 Dodaj Przesunięcie adresowania
- 8. Uzyskaj pełny adres URL serwletu podczas uruchamiania pod Tomcat 7
- 9. Biorąc pod uwagę adres IP i maskę sieci, jak mogę obliczyć adres sieciowy za pomocą bash?
- 10. x86 instrukcja montażu: call * Reg
- 11. Czy można przeskoczyć do zamkniętych fałd w Vim?
- 12. Jak przeskoczyć do kotwicy w częściowym widoku kątowym?
- 13. dereferencing etykietę w montażu x86
- 14. x86 max/min instrukcje asm?
- 15. Potrzebujesz pomocy w zrozumieniu instrukcji E8 asm call x86
- 16. x86 CMP Instrukcja Różnica
- 17. System.Windows.Forms.WebBrowser: wymusić X86?
- 18. bootloader Linux x86
- 19. x86 Assembly Cache Store
- 20. powtarzając instrukcja mov x86
- 21. Zgromadzenie x86 - „zostawić” Instruction
- 22. x86-64 użycie LFENCE
- 23. x86 jnz after xor?
- 24. Pointer Deferencing w x86 Kod Zgromadzenie
- 25. Szukaj vim pomoc dla tematu pod kursorem
- 26. Duży PCIe DMA Linux x86-64
- 27. Linux x86/x64: Wyłącz błędne ustawienia danych
- 28. Program do debugowania systemu DOS dla 32-bitowego zestawu x86
- 29. Adres etykiet (MSVC)
- 30. Menu pod Magento pod admin
Dlaczego do cholery potrzebujesz przejść do surowego adresu? Mam trudności ze zrozumieniem wszelkich możliwych (nie-nikczemnych) zastosowań do tego. – kquinn
Jakiego systemu używasz? –
@kquinn niezależnie, jego pytanie zostało zadane, spróbujmy na nie odpowiedzieć. – samoz