완료됨
코드 메모리 주소 구분 질문입니다..!

[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax
...
0x401000 | mov rbp, rsp
...
0x401007 | leave
0x401008 | ret <= rip

프로시저 ret 설명에서 [Code] 부분 질문드립니다.

위의 코드의 첫번째와 두번째줄의 메모리주소를 보시면 0x400000 다음 0x400005이 나오는데 메모리는 한 주소당 8바이트의 공간이 있기 때문에 0x400000 다음에는 0x400008이 와야 되는거 아닌가용? 그리고 마지막 두개의 줄은 왜 0x401007 다음 0x401008이 오나요?

#리버싱 #배경지식
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 4

여기서 8바이트는 64비트 시스템에서 메모리에 데이터를 한 번에 읽고 쓸 수 있는 크기를 의미합니다.

"메모리는 한 주소당 8바이트의 공간이 있다"는 것은 여기서 나온 말입니다.

다만, 실제 메모리 주소는 연속적이기 때문에 각 명령어의 크기만큼 떨어져 있습니다.

마지막 두 개의 줄은 leave가 1바이트의 공간을 차지하는 명령어 이기 때문에 1바이트 차이가 나는 것입니다.

2023.07.01. 17:01
avatar
wyv3rn
무플 방지 위원회장

말씀하신 부분은 코드 영역이고, 8바이트씩 움직이는건 스택 영역입니다.
코드영역에서는 '코드 뭉치' 만큼 움직입니다.

0x400000 | call 0x401000
0x400005 | mov esi, eax
에서 call 0x401000의 코드 뭉치는 5바이트 입니다.

2023.07.01. 18:50
avatar
wyv3rn
무플 방지 위원회장

쉽게 다음 코드의 주소와 현 코드를 빼면 됩니다 ㅎㅎ 자세하게 어떤 구조인지는 opcode table을 참고하시면 좋을 것 같습니다

2023.07.05. 22:04
코리아
강의 수강: 1

올리디버거에 보시면
주소 | 기계어 | 어셈블리어로 나눠져 있습니다.
0x400000 | E8 CF0D0000 | call 0x401000
0x400005 | 8BF0 |mov esi, eax

0x400000에서 기계어(E8 CF0D0000이 5바이트)만큼 이동하면
다음 주소 0x400005가 됩니다.
물론 0x400005에서 8BF0(2바이트) 이동하면 0x400007 이겠죠

2023.07.05. 23:45