01.Frame Pointer Overwrite(One-byte Overflow) - x86
32 bit Binary의 경우 64bit와 달리 스택을 16 바이트 경계에 정렬하는 코드가 추가된다.
x86-64 ABI는 16 바이트 스택 정렬이 필요하다.
ABI와 호환되지 않는 환경에서 스택 공간을 제한해서 사용하기 위해서다.
펜티엄 III에서 SSE(Streaming SIMD Extension) 데이터 유형 __m128이 16 바이트 정렬되지 않으면 올바르게 작동하지 않을 수 있다.
- vuln 함수의 프롤로그 직후 stack을 보면 vuln의 ebp는 0xffffd378 -> 0xffffd388(main's ebp)가 들어있다.
- vuln함수에서 입력을 받으면 ebp의 1byte를 overwrite 할 수 있어 0xffffd338이 0xffffd341로 변한걸 확인할 수 있다.
- overwrite된 값은 leave 명령어에 의해 ebp에 저장된다.
다음과 같이 코드의 흐름이 변경된다.
- 1byte overwrite된 ebp의 [ebp-0x4]가 buf의 시작 주소를 가리키도록 해야한다. 따라서 overwrite 할 때 buf의 시작 주소 + 0x4를 한 값을 넣는다.
- ecx는 buf의 스택 주소이며, [ecx-0x4]가 system함수가 들어있는 스택 주소가 되어야 한다. system 함수는 buf+0x4에 위치하므로 buf의 스택 주소에 +0x8한 값을 넣는다.
REF: https://www.lazenca.net/display/TEC/01.Frame+Pointer+Overwrite%28One-byte+Overflow%29+-+x86
01.Frame Pointer Overwrite(One-byte Overflow) - x86 - TechNote - Lazenca.0x0
Excuse the ads! We need some help to keep our site up. List Frame Pointer Overwrite(One-byte Overflow) - x86 x86에서도 x64 환경과 같이 Frame Pointer를 1byte 덮어써서 코드의 흐름을 변경 할 수 있습니다.32 bit Binary의 경우 64bit
www.lazenca.net
02.Frame Pointer Overwrite(One-byte Overflow) - x64 (0) | 2020.06.29 |
---|
댓글 영역