먼저 사이즈를 고리기 위해 0 을 서버에 보낼 때 해당 코드를 사용하였습니다.
r.sendlineafter("Size: ","0")
갑자기 든 생각이, 이렇게 0을 스트링으로 해서 보내면 0의 아스키 값인 0x30이 보내지는건 아닌가요?
0의 아스키값인 0x30이 서버에서 읽히면 숫자 48로 인식되는건 아닌가요? 이 문제 외에도 이런 경우가 종종 있었던것 같아서 궁금해 질문 남깁니다.
pwntools은 기본적으로 서버와 클라이언트 사이 문자열, 정확히는 '바이트열'을 주고받습니다.
sendline(b'0') 과 같이 실행할 경우 실제 서버에서 키보드로 0을 입력하고 엔터를 누른 것과 같은 효과를 냅니다.
지금 주어진 예시의 경우 p.sendlineafter("Size","0")
과 같이 바이트열이 아닌 일빈 문자열을 인수로 보내고 있는데, 이러면 프로그램이 종종 오작동할 수 있으로
p.sendlineafter(b'Size',b'0')
과 같이 b를 씌워서 인자로 바이트열을 보내고 있음을 명확히 하는 것이 좋습니다.
안녕하세요. 먼저 질문 주신 내용에서 r.sendlineafter("Size:", "0")
이렇게 데이터를 송신하면 0의 ASCII 값인 0x30이 보내지는 것은 맞습니다. 다만, 서버에서 0x30이라는 데이터를 scanf("%d", &size);
이렇게 "%d"로 입력 받기에 size
변수에는 '0'에 해당하는 0x30 값이 아닌, 0 값이 저장되게 됩니다.
만약 scanf("%s")
혹은 read()
등의 입력 함수를 통해 입력을 받았다면, "0"에 해당하는 0x30 데이터를 그대로 메모리에 저장했을 것입니다.
정리하자면, 데이터를 전송할 때는 0x30이라는 데이터를 보냈고 실제로 서버에서도 0x30 데이터를 수신한 것이 맞으나 서버에서 0x30이라는 데이터를 그대로 저장하는 것이 아니라 scanf("%d")
로 숫자로 해석하여 저장하기에 0이라는 데이터가 저장됩니다.
참고로, 위의 분이 답변 주신 것과 같이 pwntools에서 데이터를 송신할 때는 bytes
type으로 보내는 것이 안전하지만, 질문 주신 것과는 관련이 없습니다.