цикл 0xb7 собирается, но не связывается - PullRequest
0 голосов
/ 09 мая 2019

У меня есть следующий код ASM в Debian, который я пытаюсь скомпилировать, но у меня проблемы с ld и gcc.

uname -a: Linux kali 4.18.0-kali3-amd64 #1 SMP Debian 4.18.20-2kali2 (2018-11-30) x86_64 GNU/Linux

Я начинаю с запуска: nasm -f elf shellcode.asm

Это завершается без проблем.

GCC Issue ... Команда: gcc -m32 -o key shellcode.o Ошибка:

/usr/bin/ld: shellcode.o: in function `_start':
shellcode.asm:(.text+0x0): multiple definition of `_start'; /usr/lib/gcc/x86_64-linux-gnu/8/../../../../lib32/Scrt1.o:(.text+0x0): first defined here
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/8/../../../../lib32/Scrt1.o: in function `_start':
(.text+0x28): undefined reference to `main'
/usr/bin/ld: shellcode.o: in function `_start':
shellcode.asm:(.text+0xbc): relocation truncated to fit: R_386_PC8 against `*UND*'
collect2: error: ld returned 1 exit status

Я такжепробовал с ld.

Команда: ld -m elf_i386 -s -o key shellcode.o

Ошибка ...

ld: shellcode.o: in function `_start':
shellcode.asm:(.text+0xbc): relocation truncated to fit: R_386_PC8 against `*UND*'

Последняя, ​​как представляется, менее полна ошибок и указывает на проблемус синтаксисом ASM.

У меня такой вопрос: какую из этих команд использовать в правильной команде и что я делаю неправильно?

shellcode.asm

global _start
_start:
    xor eax,eax
    push eax
    push dword 0x76767975
    push dword 0x22717172
    push dword 0x22737972
    push dword 0x77207922
    push dword 0x78272079
    push dword 0x27277976
    push dword 0x77707470
    push dword 0x22777272
    push dword 0x22277622
    push dword 0x79727473
    push dword 0x27727377
    push dword 0x75747078
    push dword 0x70227479
    push dword 0x75222073
    push dword 0x24747176
    push dword 0x74782324
    push dword 0x72727320
    push dword 0x27762779
    push dword 0x20277777
    push dword 0x22207573
    push dword 0x70247827
    push dword 0x70277479
    push dword 0x24712379
    push dword 0x77742027
    push dword 0x76242379
    push dword 0x22702270
    push dword 0x73762577
    push dword 0x24752272
    push dword 0x20277172
    push dword 0x23712720
    push dword 0x72722478
    push dword 0x70252723
    push esp
    pop esi
    mov edi,esi
    mov edx,edi
    cld
    mov ecx,0x80
    mov ebx,0x41
    xor eax,eax
    push eax
    lodsb
    xor eax,ebx
    stosb
    loop 0xb7
    push esp
    pop esi
    int3
    db 0x0a

1 Ответ

2 голосов
/ 09 мая 2019

Для сборки с помощью gcc вы определяете _start, а не main, поэтому вам нужно использовать -nostdlib. Как gcc -m32 -nostdlib -static -o key shellcode.o. Это заставит gcc вызывать ld так, как вы это делали вручную.


loop доступен только со смещением rel8, поэтому он не может достичь абсолютного адреса 0xb7 с гораздо более высокого адреса, где ld размещает его в сегменте кода.

Если вы действительно хотите это сделать (но вы почти наверняка этого не сделаете) , вы можете использовать dec ecx / jnz 0xb7, который будет использовать кодировку jcc rel32 и, следовательно, можно получить любой абсолютный адрес через EIP + rel32. Или используйте скрипт компоновщика, чтобы связать сегмент TEXT по очень низкому виртуальному адресу, чтобы loop rel8 мог достичь.

(Но в любом случае это не зависит от позиции. Обычно шелл-код должен работать после внедрения по неизвестному адресу. Если вы действительно хотите перейти к абсолютному адресу в независимом от позиции шелл-коде, например, вызвать конкретную ошибку страницы (?), вам нужен адрес в реестре и использовать jmp eax)


Но гораздо более вероятно, что вы захотите перейти в другое место в своем коде , а не к какому-либо низкому абсолютному адресу. Поместите метку на цель вашего филиала и используйте dec ecx / jnz label. (Или используйте инструкцию loop, так как вы, вероятно, оптимизируете размер кода независимо от того, насколько он медленный.)


Если вы позаимствовали этот код где-то, возможно, он находился в ассемблере, где loop 0xb7 устанавливает значение смещения rel8. Или, может быть, это был NASM с org 0x0 и BITS 32, делающими плоский двоичный файл? Но было бы гораздо больше смысла просто использовать метку, если вы хотите вернуться обратно в этот код.

...