LINUX.ORG.RU

nasm + shared libraries


0

0

кто нибуть занимался написанием shared libraries в nasm?

проблема следующая - имеем код (как написано в доках по nasm):
$ cat intruder.asm 
BITS 32
SECTION .text

extern process_path
extern  _GLOBAL_OFFSET_TABLE_ 

%macro  get_GOT 0 

        call    %%getgot 
  %%getgot: 
        pop     ebx 
        add     ebx,_GLOBAL_OFFSET_TABLE_+$$-%%getgot wrt ..gotpc

%endmacro

update_ebx:
global update_ebx:function

pushad

push ebx

get_GOT

call process_path wrt ..plt
add esp, 4

mov [esp-4*4], eax

popad

ret

$ cat sandbox.c 
#include <stdio.h>

extern char* process_path(char *path)
{
 printf("%s\n", path);

 return path;
}

$ gcc -Wall -pedantic -fPIC -c -mtune=i686 -O3 -mmmx -msse -msse2 -malign-double -osandbox.o sandbox.c
$ nasm -ointruder.o -f elf intruder.asm
$ ld -shared -fPIC -o installtrace.so    sandbox.o intruder.o -ldl -lc

почему то при запуске функции в этой библиотеке имеем (отладчик самопальный - сильно не ругайте):
command = 00e85360, eip = b7ef92a0, ebx = b7f0e747
command = 0000e853, eip = b7ef92a1, ebx = b7f0e747
command = 000000e8, eip = b7ef92a2, ebx = b7f0e747
command = c1c3815b, eip = b7ef92a7, ebx = b7f0e747
command = 10c1c381, eip = b7ef92a8, ebx = b7ef92a7
command = ffff99e8, eip = b7ef92ae, ebx = b7efa368
command = 0010a3ff, eip = b7ef924c, ebx = b7efa368
command = ffffffff, eip = 00000252, ebx = b7efa368

т.е. оно уходит по непонятному адресу - даже в таблице символов он не определен:
$ nm installtrace.so 
000002a7 t ..@5.getgot
0000137c A __bss_start
000012c0 A _DYNAMIC
0000137c A _edata
000002bf t end
0000137c A _end
00001368 a _GLOBAL_OFFSET_TABLE_
0000028e t __i686.get_pc_thunk.bx
00000260 T process_path
         U puts@@GLIBC_2.0
000002a0 t update_ebx


Что я делаю не так? :(

ф-я process_path будет считать локальной для intruder.o, тк она не объявлена ни в каком хидере. попробуйте объявить хидер, в котором даётся описание данной ф-ии и заинклудить его в sandbox.c.

asgard
()
Ответ на: комментарий от asgard

+ extern выкинуть тоже можно, ибо он к чертям не нужен.

asgard
()
Ответ на: что от anonymous

> Если не секрет, то что вы ожидали увидеть?

Печать строки, на которую указывает EBX (хотя бы так). При этом должен произойти вызов функции process_path, находяйщейся в sandbox.c. А этого не происходит - происходит вызов по неопределенному адресу :(

generatorglukoff ★★
() автор топика
Ответ на: комментарий от generatorglukoff

1) а почему вы решили что ebx должен указывать на строку? 2) если адрес неизвестный то почему вы не ловите SIGSEGV ?

3) а читали ли вы доку по ELF ?

anonymous
()
Ответ на: комментарий от anonymous

1) а почему вы решили что ebx должен указывать на строку?

потому что идет перехват sys_open, и ebx указывает на путь. Впрочем, даже если я ошибаюсь, это не важно, т.к. до печати на экран не доходит - оно ломается раньше

2) если адрес неизвестный то почему вы не ловите SIGSEGV ?

ловю, отладчиком

3) а читали ли вы доку по ELF ?

читал - по elf и по программированию в nasm

4) и еще почему вы решили что значение еременной patch и ebx - это одно и то же?

внимание на строчку push ebx - засовываем параметр функции. Впрочем, это опять не важно - вызов-то не происходит

generatorglukoff ★★
() автор топика
Ответ на: комментарий от asgard

> ф-я process_path будет считать локальной для intruder.o, тк она не объявлена ни в каком хидере. попробуйте объявить хидер, в котором даётся описание данной ф-ии и заинклудить его в sandbox.c.

бесполезно, process_path - уже экспортируемое имя из библиотеки

generatorglukoff ★★
() автор топика
Ответ на: комментарий от generatorglukoff

а тепреь вопрос: где вся эта информация в исходном сообщении? или вы расчитывали на вернувшихся из отпуска телепатов?

ЗЫ: в упор не вижу в приведенном вами коде push ebx для передачи параметра функции. Ткните меня носом пожалуйста.

anonymous
()
Ответ на: комментарий от anonymous

> в упор не вижу в приведенном вами коде push ebx для передачи параметра функции. Ткните меня носом пожалуйста.

update_ebx: global update_ebx:function

pushad

push ebx ; <<<<<<-------------------------------

get_GOT

call process_path wrt ..plt add esp, 4

mov [esp-4*4], eax

popad

ret

generatorglukoff ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.