gdb로 분석할 때 printf 이후에 ebp 값 바뀌는 이유

gdb.attach로 했을 때는 main 함수에서 leave, ret 하면서 제대로 돌아가는 걸 확인할 수 있었는데
gdb 로 테스트를 할 때는 printf 가 돌아가면서 내부 call 하는 와중에 ebp에 있는 값이 다시 덮여서 확인이 어렵더라고요..
화면 캡처 2022-04-19 162914.png
화면 캡처 2022-04-19 170530.png
왜 이런 차이가 발생하는 건가요?

#pwnable
작성자 정보
답변 1
avatar
bincat
세계수

보여주신 것만으로는 어떻게 덮였다는건지 잘 모르겠습니다!
다만 말씀하신게 0xffff??00 <= 이렇게 덮여버린 ebp 주소에 적혀있는 데이터가 달라지는거라면 그럴 수 있습니다.
gdb.attach는 항상 ASLR이 반영된 상태를 보여주지만 gdb 로 실행했을때는 ASLR이 작동하지 않아 항상 같은 값을 보여주기 때문입니다.

stack 주소는 libc처럼 하위 1.5바이트가 랜덤이 아니라고 보장할 수도 없으며
gdb로 실행했을때와 gdb.attach로 실행했을때 여러 데이터가 같음을 보장할 수 없어(e.g. argv[0]) 스택의 상태는 다르게 나올 수 있습니다.

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