2012-10-11 2 views
0

문자열 올리 디버그를 통해 확인 마지막 문자에 널 (null) 바이트를 넣는 동안 아래 코드에서 오류 "를 기록하는 동안 액세스 위반"내가 갖는이 사람이 밖으로 정렬에의 도움을 감사하십시오 수조립 문자열 수정 액세스 위반

[SECTION .text] 

global _start 

_start: 

jmp short  stuff 
code: 

pop    esi 
xor    eax,eax   
mov byte  [esi + 17],al ; put a null byte byte on [esi + 17] 

stuff: 
call   code 
db    'This is my string#' 
+0

여기에서 잘 작동하는 것 같습니다. –

답변

1

자기 수정 코드 실행 중 : 플랫폼에 따라 작동하지 않을 수도 있습니다. 보호 모드에서는 코드 세그먼트가 읽기 전용이기 때문에 작동하지 않습니다 (DOS에서는 386에서 완벽하게 작동합니다)

문자열을 데이터 세그먼트에 넣거나 링커에게 " .text 세그먼트 (예 : /SECTION:.text,EWR)에 "쓰기 가능"태그가 있어야합니다.

(a) 코딩 방법이 좋지 않아서, (b) 소위 "다형성"바이러스 엔진에서 사용되고 바이러스 백신 소프트웨어에 의해 승인되지 않았기 때문에 (c) 가상화를 방해 할 수 있으므로 환경 조작, 마침내 (d) 프로세서 프리 페치로 인해 일부 하드웨어 구성에서 임의로 작동하지 않을 수 있습니다.

그렇게할만한 이유가 없다면 데이터 세그먼트를 선언하고 거기에 문자열을 배치하는 것이 좋습니다.

+0

@iserni 간단한 쉘 코드를 작성하려고 했으므로 코드 세그먼트에 문자열을 유지하고 쉘 코드에서 널 (NULL)을 피하기 위해 런타임시 종료시 문자열을 수정하는 것이 유일한 방법입니다. – user1737684

+0

음. 학습 목적으로, 당신은 코드를 스택 스매싱을 통해 배포한다고 생각합니다. 그래서 간단히 타겟 애플리케이션을 재 컴파일하여 (Linux GCC에서'-fno-stack-protector -z execstack' 인수로 "간단한 스택 실행"을 추가하십시오) 'gcc '에요. 윈도우즈 컴파일러가있는 트럭이 거의 없습니다.) 그러면 쉘 코드가 작동합니다. 실제 세계에서는보다 정교한 기법을 사용하지만 ASLR 및 DEP와 같은 방어 기술은 점점 더 어려워지고 있습니다. – LSerni

0

코드로 지정된 섹션/세그먼트는 실행 가능하고 읽기 전용이며, 쓰기가 가능하지 않습니다.

데이터 섹션에 문자열을 입력해야합니다. .data.

또한 mov byte [esi + 17],al 이후의 실행을 stuff:이 아닌 다른 위치로 돌리려는 것입니다. 그렇지 않으면 프로그램이 무한 루프를 입력하게됩니다.