완료됨
width*height 실제 저장되는 값

width가 65536이고 height가 65537이라고 가정하겠습니다. 이 경우 width * height의 값은 65536 * 65537 = pow(2, 32) + 65536이므로 실제로 저장되는 값은 65536 * 65537이 아닌 65536이 됩니다.

이 문장이 이해가 잘 안갑니다.

width, height가 둘다 unsigned int 이므로 w * h 연산의 결과가 pow(2,32)를 넘을 수 있다는 부분은 이해가 가는데
실제 저장되는 값은 왜 65536이 되는 건가요?

#시스템해킹
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
Clean
Dreamhack Beta CTF 참여

unsigned int 는 32비트 자료형으로, 0 ~ pow(2, 32)-1까지의 숫자만 표현 할 수 있습니다.
pow(2, 32) - 1은 이진법으로 11111111111111111111111111111111이고, 여기에 1이 더해지면 오버플로우가 일어나
00000000000000000000000000000000이 됩니다.
따라서 w * h = pow(2, 32) + 65536는 앞의 pow(2, 32)가 오버플로우로 인해 0이 되고 65536만 저장되게 됩니다.

2021.07.13. 04:07