2015-10-19 2 views
4

Мне нужно научиться вручную создавать исполняемые файлы ELF. До сих пор я делал использование онлайновых руководств, такие как:Вручную создаваемые аварийные ошибки ELF с SIGSEGV

После нескольких неудач я упрощенный свою программу на следующем (предполагаются только выход с код возврата 0):

0000000: 7f45 4c46 0101 0100 0000 0000 0000 0010 .ELF............ 
0000010: 0200 0300 0100 0000 8080 0408 3400 0000 ............4... 
0000020: 0000 0000 0000 0000 3400 2000 0100 2800 ........4. ...(. 
0000030: 0000 0000 0100 0000 5400 0000 8080 0408 ........T....... 
0000040: 0000 0000 0c00 0000 0c00 0000 0500 0000 ................ 
0000050: 0010 0000 b801 0000 00bb 0000 0000 cd80 ................ 

Когда я пытаюсь выполнить его, он падает с SIGSEGV. GDB отпечатки:

During startup program terminated with signal SIGSEGV, Segmentation fault. 

Что я сделал не так?

+0

Возможный дубликат [Как сделать исполняемый файл ELF-файл в Linux с помощью шестнадцатеричного редактора?] (Http://stackoverflow.com/questions/26294034/how-to-make-an-executable-elf-file-in-linux-using-a-hex-editor) или иначе это отладка этого вопроса «кода». –

ответ

2

С бинарным, я получаю другой вывод из GDB:

(gdb) r 
Starting program: /tmp/sample.elf.bad 
During startup program terminated with signal SIGKILL, Killed. 

Глядя на двоичном:

readelf -l sample.elf 

Elf file type is EXEC (Executable file) 
Entry point 0x8048080 
There are 1 program headers, starting at offset 52 

Program Headers: 
    Type   Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align 
    LOAD   0x000054 0x08048080 0x00000000 0x0000c 0x0000c R E 0x1000 

Здесь вы просите, чтобы ядро ​​mmap сегмент с файлом смещения 0x54 в виртуальный адрес 0x08048080.

Поскольку эти два числа не равны друг другу по модулю размера страницы, ядро ​​отказывается:

strace ./sample.elf 
execve("./sample.elf", ["./sample.elf"], [/* 42 vars */] <unfinished ...> 
+++ killed by SIGKILL +++ 
Killed 

Над трассированием означает, что ядро ​​пытались создать процесс, не нравится то, что он видел, и прекращается это с предубеждением. Выполнена ни одна инструкция вашего двоичного файла.

Закрепление виртуальный адрес LOAD и точку входа, чтобы быть 0x08048054 производит необходимое рабочее исполняемым:

strace ./sample.elf 
execve("./sample.elf", ["./sample.elf"], [/* 42 vars */]) = 0 
[ Process PID=23172 runs in 32 bit mode. ] 
_exit(0)        = ? 
+++ exited with 0 +++ 

Вот шестнадцатеричного для него:

hd ./sample.elf 
00000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 10 |.ELF............| 
00000010 02 00 03 00 01 00 00 00 54 80 04 08 34 00 00 00 |........T...4...| 
00000020 00 00 00 00 00 00 00 00 34 00 20 00 01 00 28 00 |........4. ...(.| 
00000030 00 00 00 00 01 00 00 00 54 00 00 00 54 80 04 08 |........T...T...| 
00000040 00 00 00 00 0c 00 00 00 0c 00 00 00 05 00 00 00 |................| 
00000050 00 10 00 00 b8 01 00 00 00 bb 00 00 00 00 cd 80 |................| 
00000060 
+0

Я получаю эту ошибку ./sample.elf: строка 1: 7F: команда не найдена 8 раз. Есть ли какие-нибудь шаги для запуска вручную написанного эльфа? – shami

+1

@shami Это шестнадцатеричный дамп файла ELF (который является двоичным). Вы не можете запустить шестнадцатеричный дамп (как вы, кажется, попробовали) больше, чем вы можете «запустить» исходный код. Чтобы превратить байты в двоичные файлы, вы можете использовать процедуру 'perl'' pack' или написать тривиальный «компилятор». –

+0

Спасибо за ваш ответ. Я следую ссылке из op. в соответствии с этим, он должен работать после chmod + x. для ясности я добавил заголовок эльфа, текстовый заголовок, заголовок данных, а затем hello word program hex. – shami

Смежные вопросы