Pwbabke.kr에서 만든 워게임 문제 풀이입니다.
문제는 꼭 풀어보고 보세요.
이 문제를 풀 때 저는 Xshell을 통해 ssh 접속을 했습니다.
이렇게요!
들어와서
ls -al
을 통해 존재하는 파일의 목록, 권한을 봐줍시다.
fd
fd.c
flag가 있습니다.
퍼미션 디나이!
fd.c가 어캐 생겼는지 봅시다.
일단 파일을 실행할 때 인자를 같이 입력을 하지 않으면
pass argv[1] a number
가 뜨면서 프로그램이 끝납니다.
argv[1]에 받은 인자는 정수화되고, 0x1234를 뺀 후에 fd에 저장하게 됩니다.
그리고 이 변수는 read 할 때 첫 번째 인자로 들어가는데요.
여기서 더 설명을 하기 전에 fd 변수가 왜 fd 변수로 이름이 되었는지 생각을 해보면
File Descriptor의 약자겠죠?
파일 디스크립터란.
리눅스와 유닉스에서 존재하는 것으로 이 두 OS는 시스템과 모든 하드웨어를 파일로 저장하는데, 프로세스(프로그램)이 시스템에 접근하기 위해서 사용되는 부여된 번호입니다.
기본적으로 파일 디스크립터는 0, 1, 2가 항상 존재하는데,
0: 표준 입력
1: 표준 출력
2: 표준 에러
를 의미하게 됩니다.
read 함수는 인자를 총 3개를 받는데
첫 번째 인자는 읽어올 파일의 파일 디스크립터
두 번째 인자는 입력할 변수
세 번째 인자는 입력할 바이트 수
를 각각 의미합니다.
따라서 파일 디스크립터의 개념과 read 함수를 종합하면
read 함수의 첫 번째 인자에 파일 디스크립터 0을 입력한다면, 이 read 함수가 실행될 때 사용자의 입력을 받아서 buf에 저장하게 됩니다.
따라서, fd 변수에 0이 저장되도록 한다면 우리가 원하는 문자열을 입력할 수 있게 되는 것이죠.
fd = atoi(argv[1]) - 0x1234
이기 때문에
argv[1]의 값이 0x1234의 정수형(10진수)라면, 됩니다.
0x1234는 4660이므로 첫 번째 인자에 4660을 입력하면 되겠죠?
이렇게 프로그램을 실행할 때 인자로 4660을 주고?
read 함수를 시작할 때 입력을 받으니까, LETMEWIN을 입력해주면, 문제를 풀 수 있게 됩니다!
끄읕
'Hacking-기초 > [PWN] Pwnable.kr' 카테고리의 다른 글
[PWN] random (1pts) (0) | 2020.08.11 |
---|---|
Pwnable.kr에서 peda 사용하기 (0) | 2020.08.11 |
[PWN] flag (7pts) (0) | 2020.08.11 |
[PWN] bof (5pts) (0) | 2020.08.11 |
[PWN] collision (3pts) (0) | 2020.08.10 |