stack allignment와 _start함수의 역할

stack allignment와 _start함수에 대한 레퍼런스를 구하기 힘들어서 질문드립니다.

며칠전 CTF에서 fake ebp를 연속적으로 일으켜 익스플로잇 하는 문제가 있었습니다.

ebp의 하위 1바이트를 \x00로 덮ㅇ고 fake ebp를 이용해 다시 main함수로 돌아갔을 때,

첫번째 fake ebp까진 스택의 페이로드의 첫번째로 높은 확률로 가르쳤으나 두 번째 fake ebp에서는 스택 페이로드의 거의 맨 마지막을 가르키거나 아예 가르키지 않았습니다.

그래서 main함수를 _start함수로 변경하니 익스플로잇을 성공할 수 있었습니다.

외국인 친구한테 물어보니
I always return to start because sometimes calling main does segfault because of stack alignment issue
스택 allignment때문에 항상 _start함수로 돌아간다고 하는데 도대체
stack allginment가 정확히 무엇이고 _start함수의 역할이 무엇이 있을까요?

_start함수에는 stack allignment를 정렬해주는 코드가 있나요??

제가 푼 문제는 이것입니다.
https://psj-study.tistory.com/126
결과적으로 풀긴 했지만 이유가 궁금하네요

#시스템_해킹 #pwn #binary
작성자 정보
답변 1
Greedun
Closed Beta Tester

따로 명시가 없으면 내부의 정의된 _start함수가 실행된 후에 또 거기서 main함수가 실행됩니다.
main함수에서 스택정렬이 안되었다면 한단계전인 _start함수에서는 스택정렬이 맞기때문에
_start함수를 정의하여 실행하면 스택정렬이 맞은 상태로 익스플로잇을 성공가능하다는 말씀 같습니다.

2021.06.25. 19:40
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기