607
2017-07-02 20:11:54
0
어셈 프롤로그 시 중간에 생기는 빈 바이트들는 더미 코드라고 생각하시면 됩니다.
일반적으로 저런 더미가 생기는 이유는 Default 컴파일 시, 스택을 정렬 (Align)을 하기 위해 함수의 프롤로그에 다음과 같은 부분이 들어 가게 됩니다.
and esp,0xfffffff0
이 뜻은 스택 프레임을 16바이트로 정렬을 하라는 의미 입니다.
예를들어 프롤로그 들어 갈때 마지막 한 바이트가 0x5c 와 같이 끝나게 되면 저 어셈 코드를 거친뒤 0x50 처럼 되게 되고 이럴 경우 12바이트 (0xc)만큼의 ebp와 esp사이에 더미 바이트가 생기게 됩니다.
현재 ssp가 없는 상황이기 때문에 저기 들어간 더미 바이트들 값의 의미는 main이 호출되기전 다른 함수들에 의해 스택에 씌여진 값이라서 무시하셔도 되지만 이러한 이유 때문에 소스코드에서 봣을때 이론적으로 x 바이트 값만 가지고 ret 을 덮을수 있는 상황에서도 해보면 더미 바이트 때문에 잘 덮히지 않게 됩니다. 따라서, 정확히 오버플로우를 하기 위해서는 글쓴이님처럼 직접 디버깅을 해서 정확한 바이트 값을 구하시는게 제일 정확합니다 ㅎㅎ
추가적으로 이러한 더미를 없애기 위해서 아래와 같이 스택 바운더리를 컴파일 옵션으로 정해주시면 됩니다.
-mpreferred-stack-boundary=2
(64 비트 인 경우 최소 4)