Этот код
mov rdi,rbx
mov rsi,128
call getcwd wrt ..plt
эквивалентен C коду getcwd(__undefined__, 128);
, где __undefined__
- это некоторое значение, которое находится в ebx
при входе в _start
. В моей системе это было NULL
, что на getcwd
сигнализирует, что буфер не передается (независимо от его размера, равного 128).
Функция getcwd
затем возвращает указатель на недавно выделенный буфер (как расширение для POSIX, см. man 3 getcwd
). Ваш последующий mov rax,1
перезаписывает этот адрес системным вызовом, а последующие инструкции передают значение в ebx
в качестве буфера для системного вызова write
. Так как это было NULL
ранее, согласно соглашению о вызовах оно остается таким, и вы вызываете write(1,NULL,128);
, который возвращает EFAULT
и ничего не пишет.