Сырец:
Собираем так:section .text
global _start
_start:
mov rax, 60
mov rdi, 0
syscall
Shell
$ nasm -g -f elf64 -o hello.o hello.asm
$ ld -o hello hello.o
$
Shell
(gdb) set disassembly-flavor intel
(gdb) b 1
Breakpoint 1 at 0x401000: file hello.asm, line 4.
(gdb) x/i 0x401000
0x401000 <_start>: mov eax,0x3c
(gdb)
0x401005 <_start+5>: mov edi,0x0
(gdb)
0x40100a <_start+10>: syscall
(gdb)
Ну, я думаю, пропишем 5 байт по адресу 0x401005, самое то будет.
----------------------------------------------------------------------------
Теперь как прописывать- чёрт его знает, как. Вот на этой страничке
https://www.sourceware.org/gdb/onlinedocs/gdb/Concept-Index.html#Concept-Index_cp_letter-X
Если мы будем искать "patching binaries" или "writing into corefiles", то это всё приведёт нас вот на эту страничку.
https://www.sourceware.org/gdb/onlinedocs/gdb/Patching.html#Patching
Shell
(gdb) set write on
----------------------------------------------------------------------------
Как-то я узнал, что память можно прописать вот так. По крайней мере, ошибок не выдаёт.
set {char*}0x401005 = (char*)0xaabbccddee
Вообще не помню, где я это взял. "help set" ничего подобного не выдаёт, как и эта страничка.
https://www.sourceware.org/gdb/onlinedocs/gdb/Concept-Index.html#Concept-Index_cp_letter-S
Но продолжим.
Итак, по логике вещей, если aabbccddee пропишется по нужному нам адресу, то она именно в таком порядке и должна прописаться, это ведь строка всё-таки.
Командуем и смотрим, что получилось (только прежде почему-то нужно запустить, чтобы бряк сработал):
Shell
(gdb) r
Starting program: /home/userd/Desktop/asm/hello
Breakpoint 1, _start () at hello.asm:4
4 mov rax, 60
(gdb) set {char*}0x401005 = (char*)0xaabbccddee
(gdb) dump memory dump.txt 0x401005 0x40100a
(gdb)
В соседней консоли смотрим dump.txt
Shell
$ hexdump -C dump.txt
00000000 ee dd cc bb aa |.....|
00000005
$