2017-09-03 11 views
-1

첫 번째 쉘 코드 예제의 작동 방식이 약간 혼란 스럽습니다. 나는 GDB를 통해 그것을 실행했고, 그것이 옳았다는 것을 확인했지만, 그것이 처음부터 어떻게 끝나는지 확실하지 않습니다. 다음과 같은 코드가 모습입니다 : (. 내가 실제로 하나의 인쇄에 "Hello World"에 처음 쉘을 생성합니다 쉘 코드를 교체했지만, 그 많은 차이를해서는 안)Shellcoder 's Handbook : 첫 번째 쉘 코드 예

char shellcode[] = 
"\xeb\x13\x59\x31\xc0\xb0\x04\x31\xdb\x43\x31\xd2\xb2\x0f\xcd\x80" 
"\xb0\x01\x4b\xcd\x80\xe8\xe8\xff\xff\xff\x48\x65\x6c\x6c\x6f" 
"\x20\x77\x6f\x72\x6c\x64\x0a\x0d"; 

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

    return 0; 
} 

ret은 정수 포인터 일 경우 어떻게 작동합니까? 4 바이트 길이 여야합니다. 셸 코드 자체는 대략 40 바이트 길이입니다! 무엇이든간에, 모든 ret은 쉘 코드의 처음 4 바이트이며 모든 것을 실행하지 않아야합니다!

누군가가 설명해 주실 수 있습니까?

답변

-1

컴파일러에 따라 다르지만 (칩 의존형) 컴파일러에 따라 다르지만 실제로 스택에있는 위치에서 자동 변수가 시작되는 곳의 주소가 스택 주소 프로세스에서 돌아올 때로 돌아 가야합니다. 그것은 그 주소를 shellcode [] 배열의 주소로 대체하기 때문에 main()이 리턴하면 거기에있는 명령을 실행합니다.