Pwntools send/sendline 관련 질문

pwntools를 사용해서 문제를 풀었는데, 페이로드가 aaa, bbb라고 하면

r.send(b'aaa\nbbb\n')

으로는 안 풀리고

r.sendline(b'aaa')
r.sendline(b'bbb')

를 사용해야 문제가 풀려서 한참 삽질했습니다. 차이점이 무엇인지 알 수 있을까요? sendline이 단순히 \n을 보내는 게 아닌 건가요? 아무리 찾아봐도 모르겠습니다 ㅠㅠㅠ

#pwnable
작성자 정보
답변 2
Karatus
워게임: 50

한 줄로 보내게 되면 입력하는 일이 있을 때 한 번의 입력에 그 줄을 한 번에 다 보내게 되는거고
두 개로 따로 보내면 두 개의 입력에 각각 값을 주는거죠.

2021.07.27. 22:20
queued
강의 수강: 10

이것저것 찾아보고 결국 이해했습니다! 헷갈렸던 첫번째 이유는 제가 '\n'이 입력을 마치는 문자라고 착각했기 때문입니다. 알고 보니 터미널에서 직접 입력할 때만 그렇게 작동하는 거였고, 그 이유는 터미널의 기본 동작이 linebreak가 입력될 때까지 사용자 입력을 전송하지 않고 대기한다는 점 (line discipline의 역할) 때문이었습니다. 그럼 read는 입력을 어디까지 읽어들이느냐는 질문이 생기는데, 그냥 하나 이상의 바이트가 들어오자마자 읽어들이고 리턴하는 거였더라고요. 저는 read가 특정 길이를 만족하거나 특정 delimiter가 나타날 때까지 입력을 받는 건줄 알았는데 그게 아니었습니다.

참고한 자료

tty의 원리: http://www.linusakesson.net/programming/tty/
read의 작동 원리: https://www.linuxtoday.com/blog/blocking-and-non-blocking-i-0/

2021.07.28. 22:09
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기