안녕하세요? 매번 친절하게 알려주셔서 정말 감사합니다.
Canary 첫 바이트가 \x00이라고 배운 내용에 대하여 질문이 있습니다. 이해가 잘 안 되어서요..
수업 내용도 마찬가지이고, 이번 문제도 마찬가지이고 카나리의 값을 찍어보면 제일 첫 주소 (스택 위의 카나리의 가장 낮은 주소값)의 값이 \x00이 아닌 것으로 보입니다.
카나리를 [rbp-8]에 집어 넣는 코드를 실행하면
0x40090a <main+15> mov rax, qword ptr fs:[0x28] <0x4008fb>
0x400913 <main+24> mov qword ptr [rbp - 8], rax
결과는
RAX 0x9456c5587b2c4e00
pwndbg> x/2x $rbp-8
0x7fffffffdf88: 0x7b2c4e00 0x9456c558
RAX 값, 즉fs:[0x28]에서 가져온 qword 사이즈의 값이 0x9456c5587b2c4e00
이고
이걸 스택에 집어넣으면 0x7b2c4e00
0x9456c558
와 같이 DWORD 단위로 순서가 앞뒤로 바뀌어 들어갑니다.
이렇게 되면, 스택에서의 카나리 첫바이트가 0x00이 아니라 0x7b가 되는 것 처럼 보여요..
여기서 궁금한 점이 있습니다.
-
위의 내용이 맞나요?
연습 문제 풀 때는 카나리 첫 바이트를 0x00으로 덮으니 printf로 카나리 내용이 출력이 되었는데, 제가 뭘 잘못 생각하고 있는지 모르겠습니다....ㅠㅠ -
그리고 여기서 왜 4바이트(DWORD 단위로) 순서가 바뀌어 들어가는지요? 리틀엔디안이 적용이 안 되었는데, 왜 안되었는지도 궁금합니다..
도움 말씀 부탁 드립니다..
감사합니다
일단 순서가 바뀌지 않습니다. 이미 레지스터에 있던 값을 넣는 것이기 값이 반전되어 저장되지 않습니다.
다만 리틀 엔디언으로 인해 출력될때 qword(8바이트)단위로 반전되어서 출력될 것 입니다. dword(4바이트)는 32비트일때고 64비트일때는 qword(8바이트) 단위로 값이 반전 됩니다.