완료됨
어셈블리 call 질문
[Register]
rip = 0x400000
rsp = 0x7fffffffc400
[Stack]
0x7fffffffc3f8 | 0x0
0x7fffffffc400 | 0x0 <= rsp
[Code]
0x400000 | call 0x401000 <= rip
0x400005 | mov esi, eax
...
0x401000 | push rbp
여기서 아무리 봐도 결과가 왜
[Register]
rip = 0x401000
rsp = 0x7fffffffc3f8
[Stack]
0x7fffffffc3f8 | 0x400005 <= rsp
0x7fffffffc400 | 0x0
[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax
...
0x401000 | push rbp <= rip
이런식으로 나오는지 모르겠습니다...
code에 0x400000 | call 0x401000 이 실행되서
0x401000 | push rbp <= rip 여기로 온 것 까진 이해했는데
push rbp 다음부터 전혀 모르겠네요...
여기저기 찾아보니까 -8을 한다는데 왜 하는지도 모르겠습니다
제발 도와주세요...
#리버싱
작성자 정보
답변
4
wyv3rn
무플 방지 위원회장
콜이라는 명령어 자체가 그런 역할을 합니다.
즉, 콜로 진입한 함수가 종료될때 다시 돌아올 주소를 push 하는거죠.
push는 스택에 값을 집어넣는데, 값이 들어오니 rsp 즉 스택의 최 상위 위치가 -8 이 되는겁니다
wyv3rn
무플 방지 위원회장
넵 그렇습니다.pop은 반대로 +8이 됩니다.
esp는 이해하신 부분이 맞습니다
wyv3rn
무플 방지 위원회장
아니요 이미 콜을 빠져나온 후에 실행되는거라 400 위치에서 해당 함수는 작동합니다.
명령어가 스택과는 상관 없는 동작이긴 하지만요.
wyv3rn
무플 방지 위원회장
아마 push를 착각하신 것 같은데, 다시 한번 더 스택에 값을 넣는거라 rbp값이 스택에 쌓이고 rsp도 한번 더 -8이 됩니다.