카나리 값 관련 질문 (첫 바이트 0x00)

안녕하세요? 매번 친절하게 알려주셔서 정말 감사합니다.

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가 되는 것 처럼 보여요..

여기서 궁금한 점이 있습니다.

  1. 위의 내용이 맞나요?
    연습 문제 풀 때는 카나리 첫 바이트를 0x00으로 덮으니 printf로 카나리 내용이 출력이 되었는데, 제가 뭘 잘못 생각하고 있는지 모르겠습니다....ㅠㅠ

  2. 그리고 여기서 왜 4바이트(DWORD 단위로) 순서가 바뀌어 들어가는지요? 리틀엔디안이 적용이 안 되었는데, 왜 안되었는지도 궁금합니다..

도움 말씀 부탁 드립니다..
감사합니다

#pwnable
작성자 정보
답변 1
avatar
김진우
대표 업적 없음

일단 순서가 바뀌지 않습니다. 이미 레지스터에 있던 값을 넣는 것이기 값이 반전되어 저장되지 않습니다.

다만 리틀 엔디언으로 인해 출력될때 qword(8바이트)단위로 반전되어서 출력될 것 입니다. dword(4바이트)는 32비트일때고 64비트일때는 qword(8바이트) 단위로 값이 반전 됩니다.

2022.03.23. 16:31
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기