일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 27 | 28 | 29 | 30 | 31 |
- 홍대 카페 장쌤
- 토라비
- 비동기배열
- useMutation error
- 홍대 예술
- graphql
- promise메서드
- 예쁜술집 예술
- 운정 소바동
- 잠실새내
- graphql 400
- 금별맥주
- 신촌 소문난집
- 홍대 토라비
- 화이트해커를 위한 웹 해킹의 기술
- 고르드
- 앙버터마카롱
- 비동기배열처리방법
- apollo react native
- graphql react native
- 잠실새내 도그존
- 지보싶 신촌점
- graphql with reactnative
- graphql with RN
- promise처리
- apolloclient
- graphql mutation error
- 화이트 해커를 위한 웹 해킹의 기술
- typescript
- 도그존
- Today
- Total
yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆
FTZ level3 풀이 본문
id: level3
pw: can you fly?
ls -l로 디렉토리 정보를 불러온다
hint 파일을 읽어보자 (cat hint)
이번 힌트에는 코드가 적혀있는 걸 볼 수 있다.
more hints를 먼저 해석해보면
동시에 여러 명령어를 사용해야하고
문자열 형태로 명령어를 전달해야한다.
즉, 문자열 형태의 명령어들을 한번에 전달해야한다는 것을 알 수 있다!
이번에는 주어진 코드를 해석해보자
//autodig
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv){
char cmd[100]; //cmd라는 char형 배열을 size 100으로 선언
if( argc!=2 ){ //argc!=2일때 (main함수에 전달되는 인자 수가 2가 아닐때)
printf( "Auto Digger Version 0.9\n" ); //먼가를 출력하고
printf( "Usage : %s host\n", argv[0] ); //사용법을 알려주는 듯 하다
exit(0); //main함수 종료
}
/*if 조건문을 만족시켰을 때
autodig 실행시 전달되는 인자가 2개일 때
(기본적으로 실행 값이 첫번째로 들어간다.
따라서 실행시킬 때 인자 하나를 더 전달할 때)*/
strcpy( cmd, "dig @" ); //앞서 만들었던 cmd에 'dig @'를 복사해주고
strcat( cmd, argv[1] ); //실행 시 전달한 인자를 cmd에 복사
strcat( cmd, " version.bind chaos txt"); //cmd에 " version.bin chaos txt"를 복사
system( cmd ); //system을 이용해 cmd 배열을 system에서 처리한다.
}
즉, 우리가 프로그램을 실행할 때 입력한 값이 cmd 배열에 복사가 된다.
(arcv[0]에는 실행경로가 자동으로 입력된다. 우리가 넣은 문자는 argv[1]에 존재한다!)
그리고 이 cmd가 system상에서 작동한다.
그렇다면 cmd에 우리가 원하는 명령어를 넣는다면?
=> 우리가 입력한 명령어가 system상에서 작동하게 된다!
우선 autodig 파일을 찾아보자
(find / -name autodig 2> /dev/null)
autodig파일의 위치를 알아냈다!
이제 /bin으로 이동해서 autodig를 실행시켜보자 (cd /bin , ./autodig)
autodig에는 setuid가 설정되어 있다. 따라서 level3의 권한으로 실행가능!
autodig에 아무런 인자도 주지않고 실행시켰을 때 코드분석한 결과처럼 사용법을 출력하는 것을 알 수 있다.
그렇다면 이제 인자를 건네주어야 하는데,
우리는 level3의 pw를 얻길 원하기 때문에 my-pass를 입력해보도록 하겠다!
리눅스에서 문자열을 인자로 건네주는 법
전달하려는 값을 ""(큰 따옴표)로 묶어서 건네준다.
my-pass만으로는 pw를 얻을 수 없는 것 같다.
그렇다면 shell을 띄운 후 my-pass를 입력하면 어떨까?
우리는 인자로 문자열 하나만 전달할 수 있고, 두가지 명령어를 전달해야한다.
리눅스에서 enter 없이 여러 명령어를 한번에 전달하는 법
명령어 사이에 ;를 넣어주면 한 줄에 여러 명령어를 입력할 수 있다.
; 사용해보기
[level3@ftz level3]$ 에서 cd 명령어와 ls 명령어를 줄바꿈 없이 실행시켜보자!
(cd /bin;ls)
위의 사진 처럼 cd 를 먼저 실행하고 ls를 실행한 결과가 바로 나타난 것을 볼 수 있다.
다시 autodig로 돌아와서
우리는 쉘과 my-pass 명령어를 줄바꿈 없이 입력,실행하려고 하기 때문에
sh;my-pass를 인자로 전해주자! (./autodig "sh;my-pass") : sh 쉘 사용 (bash 쉘도 가능)
입력 후 시간이 좀 지나야 결과가 나온다.
(ctrl+c 누르면 바로 결과 나옴)
level4 pw: "suck my brain"
'wargame 풀이 > FTZ' 카테고리의 다른 글
FTZ level6 풀이 (0) | 2020.09.15 |
---|---|
FTZ level5 풀이 (0) | 2020.09.14 |
FTZ level4 풀이 (0) | 2020.09.13 |
FTZ level2 풀이 (0) | 2020.09.12 |
FTZ level1 풀이 (0) | 2020.09.12 |