2012-03-22 7 views
15

은 정말이 코드가 무엇을 어떻게하는지받지 못했습니다 :C의 쉘 코드 - 이것은 무엇을 의미합니까?

char shellcode[] = "\xbb\x00\x00\x00\x00"   
        "\xb8\x01\x00\x00\x00"     
        "\xcd\x80";     

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

좋아, 내가 알고

int *ret; 

은 INT의 포인터를 설정합니다. 가와 :

ret = (int *)&ret + 2; 

는 RET의 주소와 2 바이트 (. 내 생각)

을 설정하지만이 무엇을 의미하지 않습니다

(int *)&ret 

내가 알고있는 &ret 의미하지만, 아니야 (int *)&ret 의미. 또한 shellcode의 값을 ret에 할당하여 쉘 코드를 어떻게 실행합니까?

(int *)&ret + 2 

과 :

UPDATE : 차이점은 무엇 는

&ret + 2 
+3

왜 그렇게 많은 downvotes ... 쉘 코드는 꽤 무해한 보입니다. – FatalError

답변

16

'문자열'shellcode은 어떤 종류의 어떤 기계 코드가 포함되어 있습니다.

int *ret;은 에 대한 포인터 인 변수 ret을 정의합니다.

할당 ret = (int *)&ret + 2;ret을 자신의 실제 위치 (또는 주소)에서 두 크기의 위치로 지정합니다. 이 주소는 스택의 주소이며 아마도 함수의 복귀 주소 (main())가 스택에 저장되는 곳일 것입니다.

할당 *ret = (int)shellcode;은 쉘 코드의 주소를 반송 주소에 할당합니다. 따라서 main() 함수가 종료 될 때 반환 주소는 프로그램을 정상적으로 종료하는 대신 수행하는 모든 작업을 수행하는 쉘 코드입니다.

캐스트가 여러 가지 죄를 덮습니다. 이 코드는 대상 환경에서 정당화 될 수있는 많은 비가 전성 가정을 만들지 만 반드시 그럴 필요는 없습니다. &ret+2(int *)&ret + 2 :


의 차이점은 무엇입니까?

주로 유형; 이것은 이전에 언급 된 많은 죄들 중 하나입니다. &retint * 대신 (int에 대한 포인터를 가리키는 포인터) 유형이 있으며 ret 유형입니다. 모든 실제 컴퓨터에서 sizeof(int *) == sizeof(int **)이 (가) 사용되기 때문에 캐스트는 숫자 결과를 변경하지 않고 컴파일러에서 잘못된 유형의 포인터를 ret에 할당하는 것에 대한 불만을 진정시킵니다.

관련 문제