linux self-modifying code

Тема в разделе "WASM.UNIX", создана пользователем pikofarad, 6 июн 2008.

  1. pikofarad

    pikofarad New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    35
    здравствуйте, я сегмент кода.
    для своей самомодификации использую функцию mprotect. также знаю о существовании некоторых статических методик, дающих мне право изменяться:
    1. если я являюсь частью простенькой программки, не вызывающей абсолютно никаких внешних функций, то свойство самомодифицируемости обретаю в результате заклинания
    # nasm -f elf src.asm
    # ld -N src.o
    2. если я являюсь частью программы, вызывающей внешние функции, то аналогичное свойство приобретаю следующим образом
    # gcc -static -Wl,-N src.c
    в этом случае я становлюсь непомерно толстым. для исправления этой плачевной ситуации пробовал
    # gcc -Wl,-N src.c
    но негодяй линкер ругался
    ...
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../../i486-slackware-linux/bin/ld: cannot find -lgcc_s
    ...
    итак, мой вопрос: "каким образом мне нужно станцевать с бубном так, чтобы выполнить нечто напоминающее пункт 2 и остаться худым?" =)
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    # gcc -c src.c
    # ld -N src.o -o src

    ?
     
  3. pikofarad

    pikofarad New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    35
    попробовал
    # gcc -c src.c
    # ld -I /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o src.o -lc -N
    линкуется без ошибок.
    Код (Text):
    1. Program Headers:
    2.   Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
    3.   PHDR           0x000034 0x00001034 0x00000000 0x000c0 0x000c0 R E 0x4
    4.   INTERP         0x0000f4 0x080480f4 0x080480f4 0x00013 0x00013 R   0x1
    5.       [Requesting program interpreter: /lib/ld-linux.so.2]
    6.   LOAD           0x0000f4 0x080480f4 0x080480f4 0x0079c 0x007a0 RWE 0x10
    7.   DYNAMIC        0x000798 0x08048798 0x08048798 0x000c8 0x000c8 RW  0x4
    8.   NOTE           0x000108 0x08048108 0x08048108 0x00020 0x00020 R   0x4
    9.   GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4
    права, как видно выше, проставляются на ура.
    одно только портит жизнь - прога, к сожалению, работает не долго:
    Код (Text):
    1. Program received signal SIGSEGV, Segmentation fault.
    2. 0xb7f12640 in strcmp () from /lib/ld-linux.so.2
    3. 1: x/i $pc  0xb7f12640 <strcmp+16>:     movzx  esi,BYTE PTR [ecx]
    Код (Text):
    1. # strace ./a.out
    2. execve("./a.out", ["./a.out"], [/* 38 vars */]) = 0
    3. brk(0)                                  = 0x8049000
    4. --- SIGSEGV (Segmentation fault) @ 0 (0) ---
    5. +++ killed by SIGSEGV +++
    6. Process 2545 detached
    пятой точкой чувствую, что ошибка скорее во мне, нежели в системе.
    при линковке без употребления -N все работает нормально, но RWE на сегмент кода, естественно, не проставляется.
    ps: хоть и оптимальный способ найден (использование mprotect), но все-таки спортивный интерес не дает покоя...