linux ptrace() получить информацию о функции

я хочу получить информацию из определяемой пользователем функции, используя вызовы ptrace().

но адрес функции нестабилен (потому что ASLR).

как я могу программно получить информацию о функциях другой программы, такой как gdb?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/user.h>
#include <sys/wait.h>
#include <sys/ptrace.h>
#include <dlfcn.h>
#include <errno.h>

void error(char *msg)
{
    perror(msg);
    exit(-1);
}

int main(int argc, char **argv)
{
    long ret = 0;
    void *handle;
    pid_t pid = 0;
    struct user_regs_struct regs;
    int *hackme_addr = 0;

    pid = atoi(argv[1]);

    ret = ptrace(PTRACE_ATTACH, pid, NULL, NULL);
    if(ret<0)
    {
        error("ptrace() error");
    }

    ret = waitpid(pid, NULL, WUNTRACED);
    if(ret<0)
    {
        error("waitpid ()");
    }

    ret = ptrace(PTRACE_GETREGS, pid, NULL, &regs);
    if(ret<0)
    {
        error("GETREGS error");
    }

    printf("EIP : 0x%x\n", (int)regs.eip);

    ptrace(PTRACE_DETACH, pid, NULL, NULL);

    return 0;
}

person osmund sadler    schedule 25.10.2012    source источник


Ответы (2)


ptrace немного уродлив, но может быть полезен.

Вот пример программы ptrace; он используется для приостановки системных вызовов, связанных с вводом-выводом. http://stromberg.dnsalias.org/~strombrg/slowdown/

Вы, конечно, могли бы также изучить gdb, но ISTR довольно огромен.

Вы также можете проверить strace и ltrace, возможно, особенно ltrace, поскольку в нем перечислены символы.

ХТН

person user1277476    schedule 25.10.2012

Вы, вероятно, захотите вызвать функцию, которая находится в определенном исполняемом файле (возможно, в общем объекте). Итак, во-первых, вам нужно будет найти базовый адрес, на который сопоставляется этот исполняемый файл, используя

/proc/pid/maps

После этого нужно найти локальное смещение интересующей вас функции, а сделать это можно двумя способами:

  1. Понимание формата файлов ELF (собственный исполняемый формат Linux) и поиск нужного функция, использующая сопоставленный файл (это требует некоторой специальности)
  2. Использование готового к использованию elfparser (вероятно, readelf) для получения смещения функции под исполняемый. Обратите внимание, что вам нужно будет выяснить реальное локальное смещение, поскольку этот инструмент обычно дает вам адрес, как если бы исполняемый файл был сопоставлен с определенным адресом.
person Eytan Naim    schedule 28.11.2019