Size: a a a

Ассемблер

2020 June 14

ВК

Владимир Кузнецов... in Ассемблер
s54816
Какой интересный насм!
это GNU Asm, но смысл тот же)
Сейчас для интереса под NASM перепишу и скину
источник

s

s54816 in Ассемблер
Владимир Кузнецов
это GNU Asm, но смысл тот же)
Сейчас для интереса под NASM перепишу и скину
У насма есть ключевое слово rel, если я правильно помню, он с ним как раз rip-relative адресацию и делает.
источник

ВК

Владимир Кузнецов... in Ассемблер
Что интересно NASM код не пришлось переписывать по особенному
global main

section .rodata
   hello_world: db "Hello, world!", 0xA, 0x0
   hello_world_length equ $-hello_world


section .text
main:
   mov rax, 0x1
   mov rdi, 0x1
   mov rsi, hello_world
   mov rdx, hello_world_length
   syscall
   
   mov eax, 0x3c
   mov rdi, 0x0
   syscall

Собираем nasm -f elf64 -g -F dwarf hello_world_64.S -o hello_world.o
Линкуем gcc hello_world.o -o hello_world
Дебажим:
$ gdb hello_world

Reading symbols from hello_world...
(gdb) b main
Breakpoint 1 at 0x1130: file hello_world_64.S, line 10.
(gdb) run
Starting program: /home/bomber/MyFiles/Programming/Assembler/hello_world

Breakpoint 1, main () at hello_world_64.S:10
10          mov rax, 0x1
(gdb) x/1i $pc
=> 0x555555555130 <main>:       mov    $0x1,%eax

Видим, что брейкпоинт сначала показал относительный адрес Breakpoint 1 at 0x1130
Потом остановившись на инструкции видим, что адрес уже конкретный 0x555555555130

Т.е. вроде как PIE активен. Вот тут во втором ответе https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld хорошо это расписано.

@zarathuster если есть возможность, скиньте пример кода, который у вас не линкутеся, и команды которыми собираете и линкуете, интересно поизучать эту тему)
источник

ВК

Владимир Кузнецов... in Ассемблер
или не PIE он все-таки, т.к. при каждом запуске адрес один и тот же 🤔
поразбираюсь дальше
источник

s

s54816 in Ассемблер
Владимир Кузнецов
Что интересно NASM код не пришлось переписывать по особенному
global main

section .rodata
   hello_world: db "Hello, world!", 0xA, 0x0
   hello_world_length equ $-hello_world


section .text
main:
   mov rax, 0x1
   mov rdi, 0x1
   mov rsi, hello_world
   mov rdx, hello_world_length
   syscall
   
   mov eax, 0x3c
   mov rdi, 0x0
   syscall

Собираем nasm -f elf64 -g -F dwarf hello_world_64.S -o hello_world.o
Линкуем gcc hello_world.o -o hello_world
Дебажим:
$ gdb hello_world

Reading symbols from hello_world...
(gdb) b main
Breakpoint 1 at 0x1130: file hello_world_64.S, line 10.
(gdb) run
Starting program: /home/bomber/MyFiles/Programming/Assembler/hello_world

Breakpoint 1, main () at hello_world_64.S:10
10          mov rax, 0x1
(gdb) x/1i $pc
=> 0x555555555130 <main>:       mov    $0x1,%eax

Видим, что брейкпоинт сначала показал относительный адрес Breakpoint 1 at 0x1130
Потом остановившись на инструкции видим, что адрес уже конкретный 0x555555555130

Т.е. вроде как PIE активен. Вот тут во втором ответе https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld хорошо это расписано.

@zarathuster если есть возможность, скиньте пример кода, который у вас не линкутеся, и команды которыми собираете и линкуете, интересно поизучать эту тему)
Вот если попробовать сделать mov eax,dword[hello_world], тогда появятся проблемы.
источник

LW

Loren White in Ассемблер
Владимир Кузнецов
Что интересно NASM код не пришлось переписывать по особенному
global main

section .rodata
   hello_world: db "Hello, world!", 0xA, 0x0
   hello_world_length equ $-hello_world


section .text
main:
   mov rax, 0x1
   mov rdi, 0x1
   mov rsi, hello_world
   mov rdx, hello_world_length
   syscall
   
   mov eax, 0x3c
   mov rdi, 0x0
   syscall

Собираем nasm -f elf64 -g -F dwarf hello_world_64.S -o hello_world.o
Линкуем gcc hello_world.o -o hello_world
Дебажим:
$ gdb hello_world

Reading symbols from hello_world...
(gdb) b main
Breakpoint 1 at 0x1130: file hello_world_64.S, line 10.
(gdb) run
Starting program: /home/bomber/MyFiles/Programming/Assembler/hello_world

Breakpoint 1, main () at hello_world_64.S:10
10          mov rax, 0x1
(gdb) x/1i $pc
=> 0x555555555130 <main>:       mov    $0x1,%eax

Видим, что брейкпоинт сначала показал относительный адрес Breakpoint 1 at 0x1130
Потом остановившись на инструкции видим, что адрес уже конкретный 0x555555555130

Т.е. вроде как PIE активен. Вот тут во втором ответе https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld хорошо это расписано.

@zarathuster если есть возможность, скиньте пример кода, который у вас не линкутеся, и команды которыми собираете и линкуете, интересно поизучать эту тему)
источник

LW

Loren White in Ассемблер
сам файл с кодом, а команды:
nasm -f elf64 foo.asm -o foo.o
g++ file.cpp foo.o
источник

Д

Дастан in Ассемблер
Ребят, я совсем не в курсе ( я новичок), а что такое ассемблер? И что на нём пишут?
источник

t

tfyvgubhinjkwaxdrctf... in Ассемблер
Дастан
Ребят, я совсем не в курсе ( я новичок), а что такое ассемблер? И что на нём пишут?
как ты оказался в этом чате?
источник

Д

Дастан in Ассемблер
Нашел
источник

Д

Дастан in Ассемблер
Ссылки
источник

Д

Дастан in Ассемблер
А что?
источник

Д

Дастан in Ассемблер
?
источник

Д

Дастан in Ассемблер
Варвара Прокофьевна, зачем так грубо
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
Дастан
Ребят, я совсем не в курсе ( я новичок), а что такое ассемблер? И что на нём пишут?
источник

ВК

Владимир Кузнецов... in Ассемблер
Владимир Кузнецов
Что интересно NASM код не пришлось переписывать по особенному
global main

section .rodata
   hello_world: db "Hello, world!", 0xA, 0x0
   hello_world_length equ $-hello_world


section .text
main:
   mov rax, 0x1
   mov rdi, 0x1
   mov rsi, hello_world
   mov rdx, hello_world_length
   syscall
   
   mov eax, 0x3c
   mov rdi, 0x0
   syscall

Собираем nasm -f elf64 -g -F dwarf hello_world_64.S -o hello_world.o
Линкуем gcc hello_world.o -o hello_world
Дебажим:
$ gdb hello_world

Reading symbols from hello_world...
(gdb) b main
Breakpoint 1 at 0x1130: file hello_world_64.S, line 10.
(gdb) run
Starting program: /home/bomber/MyFiles/Programming/Assembler/hello_world

Breakpoint 1, main () at hello_world_64.S:10
10          mov rax, 0x1
(gdb) x/1i $pc
=> 0x555555555130 <main>:       mov    $0x1,%eax

Видим, что брейкпоинт сначала показал относительный адрес Breakpoint 1 at 0x1130
Потом остановившись на инструкции видим, что адрес уже конкретный 0x555555555130

Т.е. вроде как PIE активен. Вот тут во втором ответе https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld хорошо это расписано.

@zarathuster если есть возможность, скиньте пример кода, который у вас не линкутеся, и команды которыми собираете и линкуете, интересно поизучать эту тему)
все правильно, это PIE код, gdb просто отключает рандомизацию адреса
надо gdb запускать так:
gdb -ex 'set disable-randomization off' hello_world
тогда будет видно, что каждый раз при запуске адреса разные
источник

ВК

Владимир Кузнецов... in Ассемблер
s54816
Вот если попробовать сделать mov eax,dword[hello_world], тогда появятся проблемы.
да, и правда, при использовании такой mov rsi, [hello_world] конструкции уже ругань на несовместимый с PIE код
и если переписать в виде
    lea rsi, [rel hello_world]
   mov rsi, [rsi]

то собирается успешно
источник

LW

Loren White in Ассемблер
в общем надо не напрямую к памяти обращаться, а сначало куда - то адрес грузить ?
источник

s

s54816 in Ассемблер
Владимир Кузнецов
да, и правда, при использовании такой mov rsi, [hello_world] конструкции уже ругань на несовместимый с PIE код
и если переписать в виде
    lea rsi, [rel hello_world]
   mov rsi, [rsi]

то собирается успешно
А зачем через lea? Оно должно сразу работать mov rsi,[rel hello_world]
источник

s

s54816 in Ассемблер
Подразумеваю, что мы хотим зачем-то 8 байт строки в rsi прочитать.
источник