완료됨
메모리 연산
[Register]
rax = 0x31337
rbx = 0x555555554000
rcx = 0x2
=================================
[Memory]
0x555555554000| 0x0000000000000000
0x555555554008| 0x0000000000000001
0x555555554010| 0x0000000000000003
0x555555554018| 0x0000000000000005
0x555555554020| 0x000000000003133A
==================================
[Code]
1: add rax, [rbx+rcx*8]

1번 코드 해설이 이해가 가지 않습니다. "rax의 값은 rbx+0x10(0x555555554010) 에 저장된 0x3 만큼 증가합니다."

add rax, [rbx+rcx*8] -> rax의 값에 rbx 값 + (rcx 값 * 8) 하는 것 아닌가요?
풀이 설명 부탁드립니다...!

#시스템_해킹 #배경지식
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
avatar
믕믕이부하
대표 업적 없음

일단 위에 문제를 잘못 쓰신 것 같은데 해당 문제를 질문하신 걸로 이해하겠습니다...

[Register]
rax = 0x31337
rbx = 0x555555554000
rcx = 0x2
=================================
[Memory]
0x555555554000| 0x0000000000000000
0x555555554008| 0x0000000000000001
0x555555554010| 0x0000000000000003
0x555555554018| 0x0000000000000005
0x555555554020| 0x000000000003133A
==================================
[Code]
1: add rax, [rbx+rcx*8]

1번 코드의 의미는 "rax의 값(0x31337) + {rbx의 값(0x555555554000) + rcx의 값 * 8(0x10)}라는 메모리 주소에 담긴 값" 입니다.

0x31337 + {0x555555554010: 0x0000000000000003} 이므로 0x31337 + 0x3 = 0x3133A 이 되겠네요.

rbx+(rcx * 8)에 대괄호가 있기 때문에 해당 값 자체가 아닌 해당 값이 가리키는 메모리 주소에 있는 값을 가져오셔야 합니다.

만약 대괄호 없이 add rax, rbx+(rcx * 8) 이라고 한다면 이해하신대로 rax의 값에 rbx 값 + (rcx 값 * 8)이 됩니다.

2021.11.26. 18:19