Linux. ELF Debugging. Segmentation fault.

Тема в разделе "WASM.UNIX", создана пользователем Span, 4 мар 2009.

  1. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Вечер добрый.

    Есть бинарник (ELF 32 i386), который падает сразу после запуска. Пишет Sigmentation Fault.
    Исходников нет. Отладочной информации тоже нет.

    Знаю, что в другой системе (правда не Linux) этот бинарник работает отлично.
    Т.е. запустить его все-таки можно.

    Запустил его в gdb. Сделал run. Получил Seg Fault. Сделал backtrace. В результате что-то типа:
    #0 0x00001234 ?? ()
    #1 0x00002234 ?? ()
    #2 0x00003234 ?? ()
    #3 0x00004234 ?? ()
    #4 0x00005234 ?? ()
    ...
    Опишите, п-та, как такие вещи вообще можно отладить? Никогда под никсы этим не занимался... Привык к Olly))

    Кто знает - хоть примерно укажите, куда копать. Буду очень благодарен.

    И еще. gdb сможет отладить COFF??
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Span
    Нужно узнать в каком модуле находится место гроха и дизассемблировать относящийся к этому код.
     
  3. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    А как это сделать в gdb??

    Вот что называется привык работать в ГУИ под виндовс...
     
  4. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Span
    мм.. если правильно понял... то граф оболочку для gdb загрузи.. DDD

    Seg Fault... ищи ошибку в esi и edi ...
    вобщем, видимо где-то в параметре вместо какого-то адреса (к примеру esi ) заносится непосредственное значение...
    ..
    найти подобную ошибку в gdb достаточно просто.
     
  5. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Span, gdb работает и без символов. Читай доку. up, down, print, info registers, disassemble. В инете море доков, tutorials.
     
  6. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Это не Линукс, а Юникс приложение скорее всего.
    По крайней мере, если на фасме сделать бинарник по правилам юникс и пытаться запустить в Линуксе, будет именно это сообщение.
     
  7. bsnake

    bsnake New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    91
    Что выдает?
    (gdb) print $eip
    (gdb) show mem
    $ readelf -a ./my_program
     
  8. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Так и есть. Приложение под Юникс.
    Но как запустить его?)
    Поставил abi_ldr (ibcs). Не помогает...
     
  9. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    (gdb) print $eip
    $1 = (void (*)()) 0xebc3e6

    (gdb) show mem - etogo net voobshe v gdb. Pohuzhego tozhe ne nashel.

    $ readelf -a ./my_program A vot tut ochen mnogo vsego interesnogo:

    Код (Text):
    1. ELF Header:
    2.   Magic:   7f 33 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
    3.   Class:                             ELF32
    4.   Data:                              2's complement, little endian
    5.   Version:                           1 (current)
    6.   OS/ABI:                            UNIX - System V
    7.   ABI Version:                       0
    8.   Type:                              EXEC (Executable file)
    9.   Machine:                           Intel 80386
    10.   Version:                           0x1
    11.   Entry point address:               0x804b690
    12.   Start of program headers:          52 (bytes into file)
    13.   Start of section headers:          1472884 (bytes into file)
    14.   Flags:                             0x0
    15.   Size of this header:               52 (bytes)
    16.   Size of program headers:           32 (bytes)
    17.   Number of program headers:         6
    18.   Size of section headers:           40 (bytes)
    19.   Number of section headers:         22
    20.   Section header string table index: 20
    21.  
    22. Section Headers:
    23.   [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
    24.   [ 0]                   NULL            00000000 000000 000000 00      0   0  0
    25.   [ 1] .interp           PROGBITS        080480f4 0000f4 000013 00   A  0   0  1
    26.   [ 2] .hash             HASH            08048108 000108 00089c 04   A  3   0  4
    27.   [ 3] .dynsym           DYNSYM          080489a4 0009a4 0011e0 10   A  4   1  4
    28.   [ 4] .dynstr           STRTAB          08049b84 001b84 000a39 00   A  0   0  1
    29.   [ 5] .rel.got          REL             0804a5c0 0025c0 000008 08   A  3  15  4
    30.   [ 6] .rel.bss          REL             0804a5c8 0025c8 000018 08   A  3  16  4
    31.   [ 7] .rel.plt          REL             0804a5e0 0025e0 000588 08   A  3   8  4
    32.   [ 8] .plt              PROGBITS        0804ab68 002b68 000b20 04  AX  0   0  4
    33.   [ 9] .text             PROGBITS        0804b690 003690 0ff9e8 00  AX  0   0 16
    34.   [10] .init             PROGBITS        0814b078 103078 000004 00  AX  0   0  4
    35.   [11] .fini             PROGBITS        0814b07c 10307c 000004 00  AX  0   0  4
    36.   [12] .dynamic          DYNAMIC         0814c080 103080 0000b0 08  WA  4   0  4
    37.   [13] .data             PROGBITS        0814c130 103130 01bd28 00  WA  0   0  8
    38.   [14] .data1            PROGBITS        08167e58 11ee58 007f6b 00  WA  0   0  4
    39.   [15] .got              PROGBITS        0816fdc4 126dc4 000508 04  WA  0   0  4
    40.   [16] .bss              NOBITS          081702cc 1272cc 006974 00  WA  0   0  4
    41.   [17] .note             NOTE            00000000 1272cc 00001c 00      0   0  1
    42.   [18] .symtab           SYMTAB          00000000 1272e8 015af0 10     19 2287  4
    43.   [19] .strtab           STRTAB          00000000 13cdd8 00e996 00      0   0  1
    44.   [20] .shstrtab         STRTAB          00000000 14b76e 00009a 00      0   0  1
    45.   [21] .comment          PROGBITS        00000000 14b808 01c16c 00      0   0  4
    46. Key to Flags:
    47.   W (write), A (alloc), X (execute), M (merge), S (strings)
    48.   I (info), L (link order), G (group), x (unknown)
    49.   O (extra OS processing required) o (OS specific), p (processor specific)
    50.  
    51. There are no section groups in this file.
    52.  
    53. Program Headers:
    54.   Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
    55.   PHDR           0x000034 0x08048034 0x00000000 0x000c0 0x000c0 R E 0
    56.   INTERP         0x0000f4 0x00000000 0x00000000 0x00013 0x00000 R   0
    57.       [Requesting program interpreter: /usr/lib/libc.so.1]
    58.   LOAD           0x000034 0x08048034 0x00000000 0x10304c 0x10304c R E 0x1000
    59.  
    60.  LOAD           0x103080 0x0814c080 0x00000000 0x2424c 0x2abc0 RWE 0x1000
    61.   DYNAMIC        0x103080 0x0814c080 0x00000000 0x000b0 0x00000 RWE 0
    62.   NOTE           0x1272cc 0x00000000 0x00000000 0x0001c 0x00000     0
    63.  
    64.  Section to Segment mapping:
    65.   Segment Sections...
    66.    00
    67.    01
    68.    02     .interp .hash .dynsym .dynstr .rel.got .rel.bss .rel.plt .plt .text .init .fini
    69.    03     .dynamic .data .data1 .got .bss
    70.    04
    71.    05     .note
    72.  
    73. Dynamic section at offset 0x103080 contains 22 entries:
    74.   Tag        Type                         Name/Value
    75.  0x00000001 (NEEDED)                     Shared library: [/lib/libprot.so.1]
    76.  0x00000001 (NEEDED)                     Shared library: [/usr/lib/libsocket.so.1]
    77.  0x00000001 (NEEDED)                     Shared library: [/usr/lib/libsocket.so.1]
    78.  0x00000001 (NEEDED)                     Shared library: [libnsl.so]
    79.  0x00000001 (NEEDED)                     Shared library: [/lib/libprot.so.1]
    80.  0x00000001 (NEEDED)                     Shared library: [/usr/lib/libc.so.1] program interpreter
    81.  0x0000000c (INIT)                       0x814b078
    82.  0x0000000d (FINI)                       0x814b07c
    83.  0x00000004 (HASH)                       0x8048108
    84.  0x00000005 (STRTAB)                     0x8049b84
    85.  0x00000006 (SYMTAB)                     0x80489a4
    86.  0x0000000a (STRSZ)                      2617 (bytes)
    87.  0x0000000b (SYMENT)                     16 (bytes)
    88.  0x00000015 (DEBUG)                      0x0
    89.  0x00000003 (PLTGOT)                     0x816fdc4
    90.  0x00000002 (PLTRELSZ)                   1416 (bytes)
    91.  0x00000014 (PLTREL)                     REL
    92.  0x00000017 (JMPREL)                     0x804a5e0
    93.  0x00000011 (REL)                        0x804a5c0
    94.  0x00000012 (RELSZ)                      32 (bytes)
    95.  0x00000013 (RELENT)                     8 (bytes)
    96.  0x00000000 (NULL)                       0x0
    97.  
    98. Relocation section '.rel.got' at offset 0x25c0 contains 1 entries:
    99.  
    100. ...
    101. ...
    102. ...
    Sorry za translit

    Добавил:
    Падает приложение, похоже, в модуле libc.so.1

    У меня в Linux этой либы(libc.so.1) вообще не было. Была только libc.so.6 (GNU C lib v 2.5)
    А libc.so.1 я взял из Юникса, где мое приложение отлично работает.

    Я правильно сделал? )) Или надо найти Lib.so.1 под мой linux?
     
  10. bsnake

    bsnake New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    91
    cat /proc/<pid>/maps

    libc.so.1 у тебя является загрузчиком приложения, коли ты взял его из другой ОС не удивительно, что оно падает.
    Если например поправить в бинарнике интерпритатор на /lib/ld-linux.so.2 и посмотреть что будет.
     
  11. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Спасибо за совет.

    Поменял имя загрузчика на стандартный для моей ОС (ld-linux.so.2).

    Теперь readelf выводит:
    Код (Text):
    1. Program Headers:
    2.   Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
    3.   PHDR           0x000034 0x08048034 0x00000000 0x000c0 0x000c0 R E 0
    4.   INTERP         0x0000f4 0x00000000 0x00000000 0x00013 0x00000 R   0
    5.       [Requesting program interpreter: [b]/lib/ld-linux.so.2[/b]]
    6.   LOAD           0x000034 0x08048034 0x00000000 0x10304c 0x10304c R E 0x1000
    Но прога всеравно падает. Теперь уже в ld-linux.so.2 (ld-2.5.so в моем дистре).

    Приложил скириншот дебаггера (EDB).

    Я попробовал за NOPить эту проверку, приложение завершилось само, с сообщением об ошибке: symbol lookup error. Что это значит? Как лечить?

    Вопрос остается: как запустить приложение, написанное под Юникс (SCO), из под Linux?

    Это для меня важный вопрос, так что буду рад любым советам. Дайте, чтоль, ключевые слова, чтобы почитать про ABI, interpreter, ELF, etc.

    Thx.
     
  12. agrischuk

    agrischuk New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2009
    Сообщения:
    47
    Никак, никакое шамаство тебе не поможет. Скомпилируй приложение для линукс.
    Если не сорцов - заведи себе виртуальную машину, там и запускай.
     
  13. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Нет исходных кодов.
    Запускать на ВМ нет смысла - приложение работает с БД через разделяемую память. БД двигать на ВМ нет возможности...

    Странно все это, я ведь запустил на Линуксе несколько бинарников, которые крутились на SСO. Правда там формат был coff, а не elf.
    Остался один бинарник в формате elf32-386.
    Как раз о нем речь и идет.

    Насколько я понимаю - проблема в том, что он использует библиотеки от SCO:
    Код (Text):
    1. /usr/lib/libsocket.so.1
    2. libnsl.so
    3. /lib/libprot.so.1
    4. /usr/lib/libc.so.1
    а когда я ему подсовываю такие-же, но из линукса - он в них что-то не находит (в моем случае - символ errno)

    Может есть смысл дизассемблировать приложение, поправить что нужно, а затем собрать заново?
    Чем?
     
  14. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Почемук обсуждение в разделе для новичков?!
     
  15. bsnake

    bsnake New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    91
    Судя по скрину падает в strcmp, rtld пытается сравнить строку с чем-то. Посмотри исходники glibc, что делает и в каком месте валится.

    полный readelf -a для основного бинаря и для библиотек в студию :)
    естественно архивом :)

    Что бы запустить бинарник в другой системе надо:
    1) что бы его корректно загрузил rtld
    2) отрезолвил все символы
    3) символы указывали на работающие библиотеки
    4) библиотеки взять из старой системы или написать заглушки
    5) если приложения напрямую юзает системные вызовы (что врят ли, но все может быть), написать патчик для ядра который будет предоставлять для процесса этот механизм системных вызовов и транслировать в системные вызовы linux.

    з.ы. перенесите тему в UNIX
     
  16. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Ув. модераторы, перенесите п-та тему в Unix.
     
  17. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Да, очень похоже на то. Вылет происходит, когда сравниваются 2 строки.
    Первая - название подключаемой библиотеки, вторая - нулевой указатель. Вызывается ф-я для каждой библиотеки.

    Только этот вылет происходит, когда я приложению подсовываю "родной" загрузчик из моей ОС (ld-linux.so.2). Если же я оставляю interpreter'ом в приложухе lib.so.1, который скопировал из SCO - вылет происходит на callf "вникуда".

    Ок! Скоро скину.

    Спасибо.
    Я так понимаю, что symbol lookup error - это как раз невыполненное второе условие?
     
  18. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Сделал что хотел. Помогло http://sourceforge.net/projects/linux-abi

    Кому интересно, описываю:
    Перенес все библиотеки, которые использовало приложение из старой ОС (SCO). Приложение вылетало на lcall $7 0. Я так понял, что это передача управления в ядро в SCO. Линукс такие вещи воспринимает буквально и вылетает с Seg Fault. Установил патч. Пометил свой этот ELF файл утилитой из этого патча (COFF работал и так). Установил утройство /dev/socksys 30 0.

    Все заработало.