자바스크립트 콘솔창에서 0xffff0000과 0xcafebabe를 AND 연산하려고 합니다.
> 0xffff0000 & 0xcafebabe
-889323520
> (-889323520).toString(16)
'-35020000'
AND 연산 수행 후 연산 결과를 16진수로 변환하였을 때 제가 원하는 결과는 0xcafe0000 입니다.
왜 이런 잘못된 결과가 발생하나요?
구글에 어떻게 검색해야 할까요?
1바이트씩 가르키니 0x400000 은 0x67을 가리키고 0x400001은 0x55를 가리킨다고 이해했는데 제가 이해한 데로면 0x400008은 0x44이고 0x400010은 0x10인데 11번째 줄에서 0x400010은 0x52를 가리키는데 이렇게 되면 0x400010이 가지고 있는 값은 2개가 되는 건가요? 이 부분이 이해가 안 갑니다.
리버싱 x86-64 어셈블리 명령어 >Opcode: 산술연산 부분에서
문제를 푸는데
1: add rax, [rbx+rcx8] // 8이 아니라 5아닌가요?
2: add rcx, 2
3: sub rax, [rbx+rcx8] // 8이 아니라 5아닌가요?
4: inc rax
원래는 5인데, 8로 오타가 난건가요?. 아니면 제가 잘못 이해한건가요?
아무리 봐도 오타인거 같습니다…
1. mov dl, BYTE PTR[rsi+rcx]는 '주소인 BYTE PTR[rsi+rcx]'의 값을 dl에 대입하라는 명령어 맞나요?
2. BYTE PTR[rsi+rcx]는 '주소인 rsi+rcx'의 값을 1바이트 만큼 참조하라는 명령어 맞나요? 맞다면 참조가 무엇이고
rsi+rcx인 0x400000의 값 중에 무엇을 참조하라는 건가요..
제 머리로는 답이 안 나올 것 같네요
0x400018 | 0x54 0x11 0x00 0x00 0x00 0x00 0x00 0x00. 여기에서 0x00이 xor dl, 0x30를 만나면
0x00 = 00000000
0x30 = 00110000
xor 00110000
이렇게 계산이 되는 걸로 알고 있습니다. 그러면 아스키 테이블에서 00110000이 숫자 0이라고 되어 있는데 마지막 변환되는 값이 Welcome to assembly world!000000 이 되어야 하는 것이 아닌지 궁금합니다.
1: add rax, [rbx+rcx*8] 가
rax레지스터에 [rbx + rcx*8]의 값을 더한다는 것은 알겠습니다만, 제가 16진수 계산 방법을 잘못 알고있는것인지
rbx = 0x555555554000 rcx * 8 = 0x16이므로
rbx + rcx*8 = 0x555555554016이라고 생각하였고, 이제 rax의 값에 이 값을 더해야 한다고 생각했습니다만 이렇게 계산하는 것이 맞는지 확신이 없고 답이 이와 관련된 게 전혀 없으니 잘못 계산한 것으로 보입니다.
어느 부분에서 계산이 잘못되었고 어떻게 계산해야 올바른지 알고 싶습니다.
3번 예제에서 not eax연산에 대한 답이 rax = 0xcafebabe인 이유가 무엇인가요?
eax는 32비트 레지스터니까 기존 rax = 0x35014541 에서 하위 32비트인 4541만 not 연산을 진행하여 rax = 0x3501babe 가 되어야 하는게 아닌가요?
2번째 바퀴(rcx = 1일 때)에서
rsi + rcx = 0x400001이 될 것으로 예상하는데
0x55가 dl에 저장되는 것이 아니라 0x88이 되는 것 아닌지 궁금합니다.
0x55 0x10 = (0101 0101 0001 0000)(2)
0101 010/1 0001 000/0
(1000 1000)(2) = 0x88