완료됨
5 코인 간단하지만 헷갈리네요..

먼저 사이즈를 고리기 위해 0 을 서버에 보낼 때 해당 코드를 사용하였습니다.
r.sendlineafter("Size: ","0")

갑자기 든 생각이, 이렇게 0을 스트링으로 해서 보내면 0의 아스키 값인 0x30이 보내지는건 아닌가요?
0의 아스키값인 0x30이 서버에서 읽히면 숫자 48로 인식되는건 아닌가요? 이 문제 외에도 이런 경우가 종종 있었던것 같아서 궁금해 질문 남깁니다.

#pwnable
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 2

pwntools은 기본적으로 서버와 클라이언트 사이 문자열, 정확히는 '바이트열'을 주고받습니다.
sendline(b'0') 과 같이 실행할 경우 실제 서버에서 키보드로 0을 입력하고 엔터를 누른 것과 같은 효과를 냅니다.

지금 주어진 예시의 경우 p.sendlineafter("Size","0")과 같이 바이트열이 아닌 일빈 문자열을 인수로 보내고 있는데, 이러면 프로그램이 종종 오작동할 수 있으로

p.sendlineafter(b'Size',b'0')과 같이 b를 씌워서 인자로 바이트열을 보내고 있음을 명확히 하는 것이 좋습니다.

2025.04.24. 17:22
질문자가 채택한 답변입니다. 좋은 지식을 공유해줘서 고마워요!
avatar
mini-chip
Perfect 10

안녕하세요. 먼저 질문 주신 내용에서 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으로 보내는 것이 안전하지만, 질문 주신 것과는 관련이 없습니다.

2025.04.24. 23:47