[!] hint
read 함수의 파일 디스크립터
[*] 원격 접속의 종류 중 하나로 SSH는 멀리 떨어진 다른 컴퓨터에 접속하여 명령을 실행할 수 있도록 해주는 응용 프로그램 또는 그 프로토콜을 말한다.
SSH는 호스트 주소(IP 또는 도메인)와 사용자 정보(Credential)가 있어야 한다.
ssh [user name]@[host name] [-p : 원격 호스트에 연결할 포트를 지정]
를 해주고 pw에 "guest"를 입력하면, 아래와 같이 출력된다.
서버에 연결이 되었고, ls 명령어를 통해 fd, fd.c, flag 파일이 있다는 것을 확인했다.
ls : 디렉토리 파일 표시 (도스의 dir 명령과 흡사)
ls -al : hidden 속성의 파일을 표시해주는 a 옵션과 파일 종류, 사용권한 등 자세한 정보를 보여주는 옵션
cat flag 의 명령어는 "Permisstion denied" 가 출력되며 거부된다.
그렇다면 cat 명령어를 사용하여 fd.c 를 읽어온다.
C언어 코드를 해석해보면, char buf[32] 를 전역변수로 할당해준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#include <stdio.h> // 표준 입출력 헤더파일
#include <stdlib.h>
#include <string.h> // 표준 문자열 헤더파일
char buf[32]; // char형의 배열을 32바이트의 크기로 선언했다.
int main(int argc, char* argv[], char* envp[]){
if(argc<2){ // 인자로 받은 개수가 2보다 작다면 -> 하나만 받았다면
printf("pass argv[1] a number\n");
return 0;
}
int fd = atoi( argv[1] ) - 0x1234;
// atoi는 아스키코드를 숫자로 바꾸는 함수이다. 0x1234는 10진수로 4660
int len = 0; // int형 변수 len을 0으로 초기화 해준다.
len = read(fd, buf, 32);
// read(파일 디스크립터, 버퍼, 버퍼의 크기)
if(!strcmp("LETMEWIN\n", buf)){
// strcmp 함수는 문자열을 비교했을때, 같으면 0을 반환하기에 "!"라면 1
printf("good job :)\n");
// 칭찬해준다. 칭찬을 받고 싶다.
system("/bin/cat flag");
// flag를 출력해준다.
exit(0); // 프로그램을 종료해준다.
}
printf("learn about Linux file IO\n");
return 0;
}
|
cs |
argc : argument count : 인자의 갯수(양수 값)
argv : argument vector : 인자의 벡터(문자열의 배열은 argv[argc]로 끝나는데 이는 null 포인터를 포함, argv 배열의 모든 요소는 문자열에 대한 포인터)
envp : 환경 변수에 대한 포인터의 배열로 null 포인터에 의해 종료
인자가 한 개인 경우에는 "pass argv[1] a number\n"가 출력되고 종료된다.
파일 디스크립터 | 목적 | stdio 스트림 |
0 | 표준 입력 | stdin |
1 | 표준 출력 | stdout |
2 | 표준 에러 | stderr |
입력을 받기 위해 read 함수의 fd가 0이 되어야 한다. 그렇다면 0x1234를 10진수로 바꿔서 보내면 fd는 0이 될 것이다.
fd가 0이 되었으므로, 표준 입력을 받을 것이다. 그다음 LETMEWIN 을 입력해주면 flag를 알 수 있다.
'공부 > 보안' 카테고리의 다른 글
[dreamhack] System Exploitation 3강 (0) | 2021.03.07 |
---|---|
나 보려고 정리해두는 gdb 명령어 (0) | 2021.03.07 |
[dreamhack] System Exploitation 2강 (0) | 2021.03.06 |
[dreamhack] System Exploitation 1강 (0) | 2021.03.04 |
[pwnable.kr] - collision (0) | 2021.03.01 |