Прыжок по адресу в сборе - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь перейти к адресу в памяти, но это только смещение в файле, поэтому 0x530 вместо 0x555555 .... но я не знаю, как это сделать.Вот код

global _start

_start:
    push rax
    push rdi
    push rsi
    push rdx

    mov rax,1
    mov rdi,1
    lea rsi,[rel msg]
    mov rdx,msg_end - msg
    syscall

    pop rdx
    pop rsi
    pop rdi
    pop rax

    mov rax,0x1111111111111111
    jmp rax

align 8
    msg db "....WOODY....",10,0
    msg_end db 0x0

Здесь я перехожу к 0x11111111111, значение, которое я изменяю на 0x530 перед выполнением файла, поэтому оно даст mov rax,0x530, однако я не знаю, как получить абсолютное значениеaddress.


В основном я пытаюсь внедрить некоторый код в файлы ELF, мне нужно изменить точку входа исполняемого файла и затем вернуться назад, так как я сначала не знаю, кудапрыжок Я положил в память значение 0x111111111111, которое я изменю исходной точкой входа в программу, как в примере, который я привел, скажем, у нас есть исходная точка входа со смещением 0x530, я должен получить доступ к памятикомпьютер что-то вроде 0x55555555fff530, вместо этого я прыгаю на смещение файла.

Я работаю над Ubuntu.

1 Ответ

1 голос
/ 05 июля 2019

Возможно, вы захотите собрать не-PIE исполняемые файлы для начала, так что все проще без ASLR для базового адреса исполняемого файла. Используйте gcc -no-pie -static foo.o. Тогда objdump сможет дать вам абсолютные адреса.

Или просто используйте REA-относительный LEA, чтобы получить адрес другого кода в том же разделе / ​​сегменте двоичного файла . Это смещение известно во время соединения (или в двоичное время редактирования).

Использование mov r64, imm64 просто усложняет жизнь для вас, потому что вы пытаетесь использовать абсолютные адреса без исправлений во время выполнения, но ваша программа будет иметь ASLR при отображении где-то около 0x5555..., если вы не отключите ASLR для нее (например, с помощью запустить его под GDB) или глобально в /proc/sys.

...