완료됨
카나리 값 관련 질문 (첫 바이트 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
믕믕이부하
대표 업적 없음
avatar
믕믕이부하
대표 업적 없음

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

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

2022.03.23. 16:31