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를 덮어쓰게되며 세그먼트 오류가 발생하게 됩니다.
'System Hacking > 시스템 해킹 공부' 카테고리의 다른 글
셸코드 만드는법 by ORANG (0) | 2014.10.20 |
---|