공부를 합니다.
[pwnable.kr] [fd] fd 문제 본문
올 여름초에 비공개로 작성해둔 fd 롸이트업인데 먼가 되게 풋풋한 문서같아서 포스팅으로 돌렸다.
- 2016.11.18
#2016.7.11
처음으로 포너블.kr 에서 가장 쉽다는 fd 문제이다.
분홍색 물방울처럼 생긴 귀여운몬스터가
==============================================
"Mommy! what is a file descriptor in Linux?"
==============================================
$ cat fd.c
문제풀기전에 동아리 선배가 C언어 복습하고 오래서 복습딱 다하고 본 첫문제였다.
내가 복습을 안했고 많이 모르는구나 라고 느낀점이 추가됬다.
여기서 기본적인 C언어 지식!
argc, argv, envp
argv[0] : 실행 경로
argv[1] ~ : 입력받은 문자열
argc는 입력 갯수
envp는 환경변수
처음에 문제를 보고 그냥 실행해보면
"pass argv[1] a number"
조건문 if 문에 argc<2 가 있으므로 아무것도 넣지않고 실행하면 저렇게 출력이된다.
여기서 보면 fd 가 등장하는데 fd는 파일디스크립터 를 의미한다.
file descriptor
0 -> 표준입력 : 키보드
1 -> 표준출력 : 모니터
2 -> 표준에러 : 모니터
어디서 많이 봣다 했더니 문제에서도 물어본당.
리눅스에서 파일디스크립터가 무엇을 의미하냐구!
파일디스크립터를 이용해서 문제를 풀면 되는 것이다!
여기서 기본적인 C언어 지식(2) !
atoi 함수와 strcmp 함수
atoi 함수는 문자열을 10진수로 변환시켜주는 함수이고
strcmp 함수는 문자열을 비교하는 함수이다.
그렇다면 여기문제에서는 buf에 담긴 문자열과 LETMEWIN 가 일치하면
.
flag 를 얻을 수 있다.
그렇다면 다시 문제로 돌아가서 fd 가 '0' 이 되어야만 입력을 받을 수 있다.
"fd = atoi ( argv[1] ) - 0x1234" = 0
그렇다면 입력을 받게끔 하려면
argv ( 받는 문자열 ) 에서 0x1234 ( 10진수로 4660 ) 만큼 뺀값이 0 이되어야 한다.
뿅!
아까와는 달리 입력을 받을 수 있게 전환이 되버렸다.
이제 flag를 얻을 수 있는 조건을 만족시켜줘야 한당.
32만큼 buf 가 할당됬는데 이제 그 buf에 어떠한 값을 주면
조건문에서 설정한 printf 가 출력되면서 system 함수가 호출이 된다.
짜잔
저것이 flag!!!
"mommy! I think I know what a file descriptor is!!"
넘나 기본적인것인데 너무 헤맸다.
열공해야지...
'공부' 카테고리의 다른 글
[pwnable.kr] [bof] bof sol (0) | 2016.11.18 |
---|---|
[공부] [메모] 문제들을 풀면서 익힌 것들 (0) | 2016.11.17 |
[poxx2016] boffee_write up (0) | 2016.10.29 |
[공부] 인투르 2 (0) | 2016.10.29 |
[공부] 인투르 (0) | 2016.10.22 |