CIDY
문자열 입출력함수 정리(중) 본문
잡담에 넣을까 생각했는데 아무래도 입출력함수의 특징은 포너블에 많이 이용될 것 같기 때문에 여기로 했다.(물론 아직 내가 다양한 문제를 풀어보지 않아서 그런 것일수도 있다.)
getc나 putc같은 문자 입출력 함수는 문자열과 달리 널바이트라던가... 딱히 특이사항이 없을 것 같아 정리하지 않았다.
*printf
사용법: printf("a");


서식문자 인자로 들어가는 걸 제외하고 기본적으로 인자는 큰 따옴표 속 문자열 하나이다.

이와 같이 실행하면 추가 인수가 전달되었다는 경고가 뜨는 것을 확인할 수 있다.
pritnf는 특별하다고 할 점이 다채로운 포맷스트링을 제외하면 딱히 없다.
https://orcinus-orca.tistory.com/50?category=564770
[Ck_수업정리] 8주차(FSB)
*Format String scanf와 printf는 %s, %d같은 포맷스트링을 사용해 입/출력을 한다. sprintf, fprintf, sscanf, fscanf, warnx같은것도 모두 포맷스트링을 이용함. 포맷 스트링을 대충 소개하자면 다음과 같다. %c..
orcinus-orca.tistory.com
포너블을 하며 쓸 만한 포맷스트링은 여기서↑ 정리했었다.\
포맷 스트링을 제외하면 문제 풀 때 많이 썼던 printf의 특징이라고 하면 %s서식문자의 경우 해당 주소에 있는 문자열을 NULL을 만나기 전까지 출력해준다는 점 정도.
*scanf
입력함수로, 입력받을 서식을 지정할 수 있다.

scanf의 특징이라고 하면 위에서 볼 수 있듯이 입력 문자열 뒤에 무조건 NULL을 하나 붙여 저장한다는 거다. ↑
위와 같이 전체를 0으로 초기화시킨 상태에서 문자열을 입력하면 위에서 볼 수 있듯이 문자열 직후 널바이트 이후 값들은 쓰레기값이 된다.
scanf로 다시 입력을 받으면 기존 값이 뭐든 깔끔히 사라지고 <새롭게 입력한 문자열> + <널> + <쓰레기값> 으로 채워진다.
그럼 널바이트는 항상 붙을까?

->위 사진의 첫 번째 경우처럼 %<N>s 로 입력 길이를 제한했을 땐 뒤에 널이 붙는 것을 볼 수 있다. 해당 케이스에서 N은 널을 제외하고 순수 내가 입력할 수 있는 크기인 것이다. (초과입력하면 입력 버퍼에 남아있게 된다.)
그리고 널까지 붙여주므로 잘못 짜여진 코드의 경우 한 바이트를 널로 덮어버릴 기회가 생길지도 모른다.
->단, 두/세 번째 경우처럼 scanf_s의 세 번째 인자로 입력 길이를 제한하게 될 경우, 해당 인자(unsigned int)는 널을 포함한 값이다. 따라서 첫 번째 케이스와 똑같이 10자리 입력을 주었지만 널까지 생각하면 제한 크기를 초과한 셈이므로, 위와 같이 아예 입력을 정상적으로 받지 않는다.
sizeof str0은 10이지만, 세 번째 경우처럼 아홉 자리까지만 입력을 정상적으로 받을 수 있는 것.
(*scanf는 gets나, fgets와 달리 엔터키를 떼고 인식한다는 점 주의)
*gets
얘도 문자열 입력함수이니 당연히 널을 붙여준다. 길이 제한이 없으므로 초과입력 가능한 것이 특징.
*fgets
(스트림 지정 기능은 차치하고..)두 번째 인자가 길이 제한 기능을 하는 부분이다. 해당 길이는 널바이트를 포함한 길이이다. 해당 길이를 초과할 경우 남은 부분은 입력 버퍼에 잔존한다.
참고로 이 친구는 엔터키까지 인식해서 널을 붙인다. 만약 str[10]에 aaaaaaaaa+ 엔터로 입력하면 str[10]에는 aaaaaaaaa + NULL이 들어가는 것이고, 엔터키는 입력 버퍼에 남게 되는 것이다.
*sprintf
'Hack > Pwnable' 카테고리의 다른 글
[Pwnable.tw] 문제풀이(CAOV) (0) | 2022.10.13 |
---|---|
[Pwnable.kr] 문제풀이(unexploitable) (0) | 2022.08.15 |
[Pwnable.kr] 문제풀이(collision) (0) | 2022.08.12 |
[Pwnable.kr] 문제풀이(fd) (0) | 2022.08.11 |
[Pwnable.kr] 문제풀이(bof) (0) | 2022.08.11 |