ssh에 접속해 보이는 c파일을 열어보니 이런 코드로 짜여져 있다.
main함수의 인자값으로 들어있는 것들의 용도로는,
argc 터미널에서 파일을 실행할 때, 뒤에 붙는 옵션의 개수 ex) a.exe -o -p 등 argc = 2
argc | 터미널에서 파일을 실행할 때, 뒤에 붙는 옵션의 개수 ex) a.exe -o -p 등 argc = 2 |
argv | 옵션의 문자열을 보여줌 하지만 argv[0]에는 파일명이 들어가있고, argv[1]부터 옵션이 들어간다. ex) a.exe -o -p 등 argv[1] = “-o” |
envp | 환경변수의 대한 정보가 들어있다. |
그러므로 if문을 통과하려면 옵션이 하나만 있어야 한다. argv[0]은 프로그램 이름이니까.
이렇게 if문을 통과하고 atoi함수로 오게 되는데 atoi함수는 문자열을 정수로 바꿔주는 함수이다.
ex) “0x1234” ⇒ 0x1234 로 변환. fd변수에는 어떠한 정수로 초기화 되겠네요.
read함수로 넘어가서 살펴보면, read 함수의 인자값으로는,
read(int fd, void *buf, size_t nbytes);
int fd 읽을 파일의 파일 디스크립터
void *buf | 읽어들인 데이터를 저장할 버퍼 (배열) |
size_t nbytes | 읽어들일 데이터의 최대 길이 (buf의 길이보다 길어서는 안된다.) |
이렇게 정해져 있다. 근데 여기서 파일 디스크립터란?
리눅스에서 파일 등을 읽거나 쓸 때 사용하여 표현되는 정수이다.
0 표준 입력(Standard Input)
1 | 표준 출력(Standard Output) |
2 | 표준 에러 출력(Standard Error) |
그럼 read함수를 통해 buf배열에 값을 입력하려면 fd는 0이 되어야 할 것이고, 0이 되려면 argv[1]의 값이 0x1234면 fd에는 0이 들어갈 것이다. 바로 입력해본다.
안된다. 왜 안되지? atoi함수는 16진수를 지원하지 않는다고 한다..
strtol계열의 함수를 이용해야한다고....
그래서 0x1234를 10진수로 변환하고 실행해봤다.
그럼 이렇게 입력을 받는다. 그리고, LETMEWIN를 입력해주고 엔터를 누르면?
이렇게 플래그가 나오게 된다.
LETMEWIN를 입력할 때 뒤에 붙어 있는 \n을 같이 쓰지 않는 이유는 당연하게도 엔터가 \n로 인식되기 때문에 입력하면 안된다.
'Pwnable 문제풀이 > Pwnable.kr' 카테고리의 다른 글
collision (0) | 2022.06.29 |
---|
최근댓글