2014-10-31 3 views
1

쉘 코드를 사용하기 전에 쉘 코드를 실험하므로 쉘코더 핸드북의 예제를 발견했습니다. 예는 다음과 같습니다.쉘 코드를 실행하는 동안 세그먼트 화 오류가 발생했습니다.

char shellcode[] = "\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x4 
\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1\xff\xff\xff\x2f\x62\x69 
\x6e\x2f\x73\x68"; 

int main() { 

int *ret; 
ret = (int *)&ret + 2; 
(*ret) = (int)shellcode; 
} 

쉘 코드는 쉘을 생성합니다. 그러나 세그먼트 오류 오류가 발생합니다. -fno-stack-protector-z execstack 옵션을 사용하여 gcc 컴파일러를 사용하여 프로그램을 컴파일했습니다. 나는 readelf 명령을 간단히 살펴했다 그리고 스택 포인터

GNU_STACK  0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x4 
+0

역 따옴표는 코드를 인용하는 데 사용되며 강조 표시는 사용되지 않습니다. –

답변

2

ret 실행입니다 당신이 그것을 선언 할 때 모든 메모리 위치를 가리키는하지 않는 것이 분명했다. 는 나중에 포인터가 가리키는 위치에 (2)를 추가하여 몇 가지 값을 할당하려고합니다. (모순 된 문이다) 나는 "GCC filename.cpp"명령을 사용하여 코드를 다음 컴파일 할

ret = (int *)&ret + 2;/* Which is wrong */ 
+0

참. 그것의 명확한 지금. 따라서 코드를 다시 읽을 때마다 간과하는 오류를 간단히 볼 수 있기 때문에 항상 다른 사람이 작성한 것을 읽어야합니다. –

+0

나는이 대답을 downvoted. 질문의 코드는 반환 주소를'shellcode'의 주소로 덮어 쓰도록되어 있습니다; 우연한 정의되지 않은 동작이 아닙니다. (그리고 분명히 휴대용이 아니거나 표준을 따르는 C가 아닙니다.) – immibis

+0

@immibis 질문에 대답하고 싶습니까? –

0

. Ti가 오류없이 컴파일되었습니다. 이것이 귀하의 의심을 푸는데 도움이되기를 바랍니다.

#include<stdio.h> 

char shellcode[] = "\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x4\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"; 

int main() { 

int *ret; 
ret = (int *) ret + 2; //I don't know why you had written this 
ret = (int *)shellcode; 

} 
관련 문제