이 글에 사용되는 모든 예시는 macOS를 기준으로 한다.
터미널에서 ~/code/example.c의 파일 구조를 ls -l 명령어를 통해 본 모습이다.
앞에서부터 순서대로
[파일 유형] [파일 권한] [파일의 링크 개수] [파일의 소유자]
[파일의 소유자의 그룹] [파일의 크기] [최종 수정 시각] [파일명]
을 나타낸다.
일반 파일(-) / 디렉토리(d) / 링크 파일(l) / 블록 디바이스 파일(b) / 문자 디바이스 파일(c)
터미널에서 chmod 명령어를 통해 파일의 권한을 변경할 수 있다.
대/소문자 s는 각각 파일에 대한 사용자의 실행 권한이 없을/있을 경우를 나타낸다.
대/소문자 s는 각각 파일에 대한 그룹 사용자의 실행 권한이 없을/있을 경우를 나타낸다.
setuid, setgid가 설정된 파일을 실행하면 각각 소유자, 그룹 소유자의 권한을 부여하는 것이다. 실행할 수 없을 때는 권한이 부여되지 않는다.
대/소문자 t는 각각 파일에 대한 기타 사용자의 실행 권한이 없을/있을 경우를 나타낸다.
root 사용자의 uid는 0이다.
공격자가 소프트웨어의 취약점을 뚫기 위해 사용된다.
리버스 쉘코드(Reverse Shellcode) : 목표 시스템이 공격자에게 연결을 하게 만든다.
바인드 쉘코드(Bind Shellcode) : 목표 시스템의 특정 포트를 바인드(?)해 공격자가 대상 시스템에 연결할 수 있도록 한다.
다운로드&실행 쉘코드(Download & Execute Shellcode) : 쉘을 직접 실행하지 않고, 외부로부터 악성코드를 다운로드하고 실행한다.
이 글에서는 wargame을 하기 위해 사용된다.
필자가 wargame을 진행한 곳은 pwnable.kr이다.
글을 읽어보니 linux의 file descriptor에 대한 내용인 거 같고 답은 아마도 flag를 통해 알 수 있을 것 같다.
문제를 풀기 위해 터미널에서 ssh를 사용해 문제에서 알려준 시스템에 접속해보자.
ssh연결을 한 후 비밀번호를 입력하면 이런 화면이 뜨게 된다.
현재 디렉토리에 뭐가 있는지 그리고 접근 권한은 어떻게 되는지 확인하기 위해 ls -l 명렁어를 사용했더니 fd, fd.c, flag라는 파일이 있다.
답을 찾기 위해 flag파일을 읽으려 했으나 접근 권한이 없어 실패했다. 또한 fd 파일을 실행해보니 "pass argv[1] a number", "learn about Linux file IO"라는 문자열이 출력된다.
fd.c을 cat를 통해 읽어보니 fd는 이 코드를 컴파일한 것 같다. 그럼 임의의 파일 디스크립터를 통해 buf 변수에 "LETMEWIN"이라는 문자열을 저장하면 우리가 원하는 flag의 값이 출력될 것이다.
fd.c에서 16진수 0x1234의 값은 10진수로 4660이었다.
그럼 fd를 실행하며 첫 번째 인자로 4660을 넘겨주면 해당 파일 디스크립터는 0번째 파일 디스크립터 즉 stdin을 의미할 것이다. stdin에 LETMEWIN을 입력해 해당 문제를 해결했다!
해결된 문제는 이렇게 초록색 띠가 생긴다😃