쉘코드 뒤에 여유 공간이 필요한 경우 by ORANG

Posted by ORANG ORANG(오랑)
2014.10.20 02:37 System Hacking/시스템 해킹 공부

FTZ나 LOB같은 문제 풀이를 하다보면..

[nop]... + [셸코드] + [SFP] + [RET] 는 세그먼트 오류가 나고,

[셸코드] + [nop]... + [SFP] + [RET] 는 공격에 성공하는 경우 를 발견할 수 있습니다.

 

1번째 방법은 안되고, 2번째 방법은 되는 차이를 간단하게 보자면..

1번째 방법의 문제를 간단한 메모리로 보겠습니다.



RET에 함수 주소가 들어오기 전 스택입니다.

이상태에서 leave와 ret 명령어가 실행되는 상황을 통해 보겠습니다.

 

leave 명령어는

mov esp, ebp

pop ebp

esp를 ebp로 옮기고(스택을 정리해주고), 이전 함수의 ebp(SFP)를 pop을 통해 다시 ebp에 저장합니다.

pop 되었으니 esp는 RET를 가리킵니다.

다시 스택을 보면..



이제 ret가 실행됩니다.

ret 명령어는

pop eip

jmp eip

현재 eip 다음에 실행될 명령어를 eip 레지스터에 저장하고 eip 주소로 점프합니다.

eip의 주소(nop+shellcode)로 점프한 후, esp는 RET+4 지점을 가리키고 있습니다.

여기서 문제가 발생합니다

스택을 보면.. 



shellcode가 실행되기 시작합니다. push명령어도 셸코드에 포함되어 있겠죠?

push 명령어가 실행될 때마다 현재 esp로부터 4바이트씩 덮어쓰며 esp가 낮은 메모리 주소 방향으로 이동합니다.

결론적으로 말하면 shellcode와 RET 사이에 충분한 여유공간이 없을 경우,

 esp가 shellcode를 덮어쓰게되며 세그먼트 오류가 발생하게 됩니다. 

  1. 마지막 사진에서 궁금한 게 있습니다.
    ret명령어가 실행되고 pop eip가 실행되게 되면
    사진에 있는 맨 위의 esp 포인터가 RET윗 부분으로 가 있어야 하지 않나요?(RET을 POP에서 EIP에 저장했으므로...)
    아니면 제가 잘못 이해한 건가요..?
    • 아뇨 pop eip; jmp eip된 시점 이후이므로 esp는 ret+4를 가리키는게 맞습니다ㅎㅎ 제가 실수했네요 지적 감사합니다~~~
    • 질문..!
    • 2015.08.06 05:06 신고
    shellcode가 실행되기 시작합니다. push명령어도 셸코드에 포함되어 있겠죠?
    push 명령어가 실행될 때마다 현재 esp로부터 4바이트씩 덮어쓰며 esp가 낮은 메모리 주소 방향으로 이동합니다.
    결론적으로 말하면 shellcode와 RET 사이에 충분한 여유공간이 없을 경우,
    esp가 shellcode를 덮어쓰게되며 세그먼트 오류가 발생하게 됩니다.

    저가 이해력이 딸려 이해가 잘 안갑니다만 esp가 낮은 메모리 주소방향으로 이동하여 쉘코드를 덮어쓰는게 왜 위험한 건가요?....
  2. 여유공간이 필요한 이유를 알았습니다.
    하지만 얼마만큼의 여유공간이 필요한지 잘 모르겠습니다.
    이걸 어떻게 계산을 해야하나요?
이 댓글을 비밀 댓글로

셸코드 만드는법 by ORANG

Posted by ORANG ORANG(오랑)
2014.10.20 02:36 System Hacking/시스템 해킹 공부


셸코드 작성_ORANG.pdf


이 댓글을 비밀 댓글로