편지를 변경하는 것과 같은 간단한 작업을 수행하여 문자열을 수정 한 다음 인쇄하는 간단한 쉘 코드 덩어리를 만들려고했습니다.쉘 코드를 사용하여 메모리의 바이트 수정하기
_start:
jmp short ender
starter:
xor ecx, ecx ;clear out registers
xor eax, eax
xor ebx, ebx
xor edx, edx
pop esi ;pop address of string into esi register
mov byte [esi+1], 41 ;try and put an ASCII 'A' into the second letter of the string
;at the address ESI+1
mov ecx, esi ;move our string into the ecx register for the write syscall
mov al, 4 ;write syscall number
mov bl, 1 ;write to STDOUT
mov dl, 11 ;string length
int 0x80 ;interrupt call
ender:
call starter
db 'hello world'
"hallo world"를 인쇄해야합니다. 문제는 (segfault) 내가 시도하고 mov
명령을 사용하여 메모리 바이트를 수정할 때 발생합니다. GDB와 pop esi
명령이 제대로 작동하지만
mov byte [esi+1], 41
esi
은 문자열의 주소를로드, 프로그램을 실행하고 모든 유효합니다. 왜 내가 올바른 주소에서 바이트 값을 수정할 수없는 이해할 수 없다. 나는 NASM과 ld가 생성 한 실행 파일을 실행하여이 "쉘 코드"를 테스트 중이며, C 프로그램이나 다른 어떤 것에 넣지 않고 아직 어셈블리에 버그가 존재하지는 않습니다.
나는 다음과 같은 빌드 명령을 64 리눅스를 사용하고
추가 정보 : 내가 추측해야한다면 나는 전체 코드 here.
당신은 아마도''W^X' (http://en.wikipedia.org/wiki/W%5EX)를 실행하고있을 것입니다. – DCoder