문제를 풀긴 풀었는데 read를 통해 카나리를 손상시킬 때 카나리까지 가지 않더라도 카나리가 손상되는 것 같아서 이유가 궁금해 질문드립니다.
문제에서 buf를 0x40만큼 할당해 주었고 디버깅을 해보니 카나리는 이보다 8바이트 뒤에 있었습니다.
read 전 버퍼의 내용입니다.
0x7fffffffe2a0: 0x00000000 0x00000000 0x00000000 0x00000000
0x7fffffffe2b0: 0x00000000 0x00000000 0x00000000 0x00000000
0x7fffffffe2c0: 0x00000000 0x00000000 0x00000000 0x00000000
0x7fffffffe2d0: 0x00000000 0x00000000 0x00000000 0x00000000
0x7fffffffe2e0: 0xffffe3e0 0x00007fff 0x891bfc00 0x6221ddb2
맨 아랫줄에 0x891bfc00 이 카나리라고 판단하고 카나리 전까지 A를 집어넣어 보았습니다.
read 후
0x7fffffffe2a0: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffe2b0: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffe2c0: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffe2d0: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffe2e0: 0x41414141 0x41414141 0x891bfc0a 0x6221ddb2
그런데 갑자기 카나리의 널바이트가 바뀌더라구요... 실제로 A를 0x48만큼 보낸 제 익스플로잇도 성공을 하였습니다.
바뀌는 이유가 무엇인지 궁금합니다.
sendline으로 보내면 값 뒤에 엔터 문자가 포함됩니다. 실제로 엔터문자(0x0a) 값이 카나리를 덮어씌운 것을 보면 이것이 원인인 것 같네요.