2012-11-04 2 views
0

편지를 변경하는 것과 같은 간단한 작업을 수행하여 문자열을 수정 한 다음 인쇄하는 간단한 쉘 코드 덩어리를 만들려고했습니다.쉘 코드를 사용하여 메모리의 바이트 수정하기

_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.

+0

당신은 아마도''W^X' (http://en.wikipedia.org/wiki/W%5EX)를 실행하고있을 것입니다. – DCoder

답변

2

를 붙여 넣은

nasm -f elf64 shellcode.asm -o shellcode.o 
ld -o shellcode shellcode.o 
./shellcode 

, 내가 좋겠 예를 들어 db hello world`가 데이터가 아닌 코드로 컴파일되고 있으며 읽기 및 실행 권한이 있지만 쓰기는하지 않습니다. 따라서 실제로 페이지 보호에 더럽혀집니다.

이 값을 변경하려면 section .data 섹션에 문자열을 넣고 nasm의 변수 구문을 사용하여 찾으십시오. 데이터를 그대로 수정하려면 mprotect 호출을 만들어 페이지의 권한을 수정하고 쓰기 권한이 있어야합니다. 참고 :이 경우 실행 파일에 계속 적용되지 않습니다. mmap()MAP_PRIVATE에 해당합니다.

+0

'section '.data'를'db'hello world '위의 줄에 놓으려고 시도했지만 여전히 segfaulted :(문자열을 변수로 변경하면 셸 코드 작업을 할 수 없습니다. 주소에 null 바이트가 있습니다 그리고 나는 셸 코드에서 정적 주소를 사용할 수 없다는 것을 읽었습니다. – user99545

+0

@ user99545'section .data' 변수는 함수의 리턴 주소에있는 것과 완전히 다른 위치에 변수를 배치합니다. 버퍼 오버 플로우 버젼의 쉘 코드에서 스택에있을 수 있기 때문에 - 실행 가능 데이터가 아닌 프로그램을 효과적으로 구축하고 있기 때문에 쓰기가 가능하지만 (실행 가능하지는 않습니다!) - 불행히도 당신은 널 바이트 카운트에 절대적으로 맞습니다. 보통 쉘 코드는 실행시 문자열을 필요에 따라 디코딩하는 것을 포함하여 이것을 피하기 위해 작성됩니다. 왜냐하면'0'은 문자열을 끝내기 때문입니다 ... –

+0

이것은 당신이 오버플로 할 수 없음을 의미합니다. buf fer와'strcpy'가 있습니다. –

관련 문제