<예제>
[Register]
rip = 0x401000
rsp = 0x7fffffffc3f8
[Stack]
0x7fffffffc3f8 | 0x400005 <= rsp
[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax
...
0x401000 | mov rbp, rsp
...
0x401007 | leave
0x401008 | ret <= rip
<결과>
[Register]
rip = 0x400005
rsp = 0x7fffffffc400
[Stack]
0x7fffffffc3f8 | 0x400005
0x7fffffffc400 | 0x0 <= rsp
[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax <= rip
...
0x401000 | mov rbp, rsp
...
0x401007 | leave
0x401008 | ret
에서 명령어가 실행될 때 마다 어떤 일이 일어나는지 설명해 주실 수 있나요? 다 이해가 안 가서.. 죄송합니다..
+)수업에서 0x40100가 왼쪽 실습에선 mov인데 오른쪽 그림설명에서는 push여서.. 무엇이 맞는것인가요?
https://learn.dreamhack.io/38#6
어느 부분이 이해가 안되시나요?
오른쪽 페이지 화살표 넘길때마다 해당 동작으로 인한 스택의 이동 및 값의 변경을 표현해주는데...
그리고 push가 맞습니다. mov는 잘못된 것 같네요.
일단 헷갈리시는 부분이, 3page에서 가리킨 곳이 실행되면 4페이지에서 표현됩니다.
이는 실제 gdb에서도 동일합니다.
즉, 현재 가리키는 곳은 명령어를 실행한 것이 아니라, 실행 직전을 의미합니다.
https://learn.dreamhack.io/38#6 3번에서 mov rbp,rsp는 rsp가 rbp로 이동하는걸로 알고있는데 그림의 설명에서는 반대인데 뭐가 맞는건가요?
-> 다시 한번 보시는게 좋을 것 같네요. 4페이지에서 rsp가 rbp로 이동했습니다.
그리고 4번에서 sub가 이해 안됩니다. sub rsp,0x30하면 rsp가 다른데를 가리켜야하는 거 아닌가요?
-> 마찬가지입니다. 5페이지에서 rsp가 이동했네요.
왜 스택공간이 확장되는지 궁금하고, 5번에서 mov BYTE PTR[rsp],0x3은 0x3을 rsp의 값을 0x3으로 저장하는 거 아닌가요? 그림처럼 rsp가 움직이려면 rsp의 주소가 변해야 하니 lea를 써야 맞는 것 아닌가요?
-> 마찬가지입니다.6페이지에서 값이 들어갔네요.
pop이니까요...