실습에서 sendlineafter 함수 사용

pwntools 실습에서 타겟 코드를 보면 "Input: " 문자열이 나온 후에 scanf로 입력을 받잖아요
그러면은 sendlineafter 함수를 사용해서 "Input: " 다음에 payload를 보내야 하는거 아닌가요?

그런데 sendafter나 sendlineafter 함수를 사용해서 보내면 마치 이 문자열이 없는 것처럼 하염없이 기다리는 상태가 됩니다.

혹시 전 강의에서 설명돼있던 printf 함수에서 버퍼를 출력할 때 조건이 충족되야만 출력하는 것 때문인가요?


추가: 지금 더 해보니까 rao.c 파일의 printf 함수 부분에 \n을 넣고 컴파일을 하게 되면 sendlineafter 함수로도 쉘이 실행이 됩니다.
\n을 통해서 printf 함수 버퍼를 출력했기 때문에 sendlineafter 함수에서 이 문자열을 찾을 수 있었던 것 같습니다.

그런데 이때에도 sendline 함수로도 잘 실행이 되었습니다.
즉, 이전에 프로그램에서 어떤 출력이 있던지에 상관없이 send나 sendline 함수는 첫번째로 입력을 받을 때에 입력을 해 줄 수 있고,
sendlineafter는 그 출력이 printf 함수에 의한 문자열을 기다릴 때, 버퍼가 출력이 되는지를 유의해야 한다
정도로 이해하고 넘어가도 될까요?

혹시 잘못된 부분이 있다면 알려주시면 감사합니다.

#시스템_해킹 #툴 #pwntools
작성자 정보
답변 2
avatar
wyv3rn
무플 방지 위원회장

네. 마지막에 설명하신게 맞습니다 ㅎㅎ

극단적인 예를 들어 폴더 내 엄청 많은 파일이 있다고 가정합시다
이때 ls 명령어를 실행하면 파일 리스트가 출력될텐데 출력되는 와중에 다른 명령어를 넣으면 출력이 완료된 후 다음 명령어가 자동으로 실행되는 것을 볼 수 있습니다.
send는 그런 동작을 합니다.

sendafter는 지정된 문자열을 받아들인 뒤 값을 보냅니다.

다른 예를 들어서 파일에서 'input : ' 이후에 값을 받는다고 생각해봅시다.

sendafter를 사용한 경우에는 반드시 'input : ' 이후에 값을 넣습니다.
하지만 send는 해당 값을 받기 전에 이미 값을 넘긴 상태이고, 이를 프로그램에서 알아서 받아들인다고 보시면 됩니다.

2022.09.06. 21:32
avatar
wyv3rn
무플 방지 위원회장

추가로 sendline과 send는 다릅니다.
sendline은 끝에 개행문자를 포함하여 전달하고 send는 없이 전달합니다.
이는 값을 전달할때 중요한 부분이 됩니다.

예를들어 스택에 0x11111111이 있다고 생각해봅시다.

send(0x22)를 하면 0x11111122가 삽입됩니다.
그런데 sendline(0x22)를 하면 0x11110a22가 삽입됩니다

조금 더 말씀드리자면 sh라는 문자열을 삽입 후 읽어야되며 스택에 aaaa가 있다고 가정합시다.

send(sh)를 하고 스택의 내용을 출력하면
aash가 출력될 것입니다.

하지만 sendline(sh)를 하면 a/nsh 가 삽입되고 이는 문자열의 끝을 나타내기에 sh만 출력됩니다.

아마 충분히 이해되시리라 생각합니다 ㅎㅎ

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