문제 소스이다.
소스를 분석하면 argc < 2 이면 pass argv[1] a number\n 가 출력된다.
파일을 실행시킬 때 "./fd 인자값" 형태로 실행시켜 접근해야한다.
Atoi 함수는 문자열을 int형으로 변환 시켜 주는것이다.
fd 는 파일디스크립터로 파일을 관리하기 위해 운영체제가 정해놓는 것이다.
미리 정해진 파일 디스크립터는 0, 1, 2 가있다.
0 은 Standard input : 표준 입력을 가리킨다.
1 은 Standard output : 표준 출력을 가리킨다.
2 는 Standard Error : 표준 에러를 출력시킨다.
따라서 파일 오픈이나 소켓 생성시 부여되는 파일 디스크립터는 3번부터 시작된다.
read 함수의 첫번쨰 인자는 fd 즉 읽을 파일의 디스크립터
read 함수의 두번째 인자는 데이터를 저장할 공간, 위치
read 함수의 세번째 인자는 2번째 인자에 저장할 데이터의 크기이다.
해당 문제에서 read함수는 fd변수에있는 번호에 해당하는 파일을 32만큼 읽어서 버퍼에 저장해라 라는 함수가 된다.
strcmp( string1, string2) 함수의 경우 string1이 string2보다 크면 0보다 큰값을 반환한다.
string1 과 string2가 같으면 0을 반환한다.
string2가 string1 보다 크면 0보다 작은값을 반환한다.
if(!strcmp("LETMEWIN\n",buf))의 조건을 만족하기 위해서는 buf에 LETMEWIN을 입력해야한다.
그래야만 strcmp함수의 반환값이 0이 될것이고 !0 == 1이 되기때문에 if문 조건을 충족 시킬 수 있다.
소스분석에 맞게 buf에 LETMEWIN\n을 입력해주기위해서는 fd 값을 0으로 즉 Standard input으로 설정해주어 우리가 원하는 문자열을 입력할 수 있게 만들어주어야한다.
0x1234는 10진수로 4660이기 때문에 ./fd 4660을 입력하고 LETMEWIN을 입력하면 문제가 풀릴것이다.
===============================================================
fd 파일 디스크립터 : 운영체제에서 설정해주는 파일들을 관리하기 위한 파일 번호 이다.
atoi 함수는 문자열에 있는 정수를 int형으로 변환해준다. 반환에 실패할경우 0이 반환된다. 모든 공백문자는 무시하며 +, - 외의 다른 문자들이 문자열안에 있을경우 0이 반환된다. 또한 숫자 뒤에있는 문자들은 무시된다.
ex) atoi("a1234") == 0
atoi("1234a") == 1234
'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글
shellshock (0) | 2018.12.19 |
---|---|
mistake (0) | 2018.12.19 |
flag (0) | 2018.12.19 |
bof (0) | 2018.12.19 |
collision (0) | 2018.12.19 |