위의 ssh 쉘로 로그인하여 ls 명령어를 통해 어떤 파일들이 있는지 확인하였다.
input 파일을 실행시켜보니 올바른 값을 요구하는 문구가 나타났다.
input.c 파일을 출력해보니 이전 문제들보다 분량이 훨씬 긴 코드를 확인할 수 있었다.
stage에 맞춰 하나하나 문제를 뜯어봐야한다.
먼저 Stage 1이다.
argc는 arguments count (함수에 전달된 인자의 개수)를 뜻하고,
argv는 arguments vector (가변적인 개수의 문자열) 을 뜻한다
argc = 100
argv[‘A’], 즉 argv[65] = \x00
argv[‘B’] = argv[66] = \x20\x0a\x0d
위의 조건을 만족해야한다.
.
그 다음 Stage 2에서는 표준입력 : 0, 표준 출력 : 1, 표준 에러 : 2임을 기억해야한다.
1. read(0, buf, 4)는 표준 입력의 4바이트를 읽어와서 “\x00\x0a\x00\xff”를 넣어준다.
2. read(2, buf, 4)는 표준 에러의 4바이트를 읽어와서 “\x00\x0a\x02\xff”를 넣어준다.
+memcmp는 특정 메모리에서 원하는 크기만큼을 비교하여 결과값을 얻어내는 함수
Stage 3에서는 환경변수에 대해 확인해야한다.
getenv() : 해당 환경변수의 값을 가져오는 함수.
“\xde\xad\xbe\xef”라는 이름의 환경변수 값이 “\xca\xfe\xba\xbe”이면 된다.
Stage 4에서는
“\0a”라는 파일을 열고, 읽어온 첫 4이트가 "\x00\x00\x00\x00“ 이어야 Stage4 clear
마지막으로 대망의 stage 5이다.
argv[‘C’]에 있는 값을 포트번호로 소켓을 생성하고 listen 하고 있다가 데이터가 들어오면 그 데이터를 buf 에 저장하고 deadbeef와 비교하는 코드이다.
이에 대한 익스플로잇 코드를 pownstool을 이용하여 작성해주었다.
코드는 아래와 같다.
사실 왜 stage5에서 포트를 40000으로 설정하는지는 아직도 의문이다.
쓰기 권한이 있는 /tmp 디렉토리로 가서 파이썬 코드를 작성해주는것도 잊지 말아야한다.
그리고 flag 파일이 현재 이 디렉토리에 없기 때문에 심볼릭 링크를 사용해주어 원본파일과 연결해주어야한다.
그러면 stage 1~5가 모두 clear 되고
Mommy! I learned how to pass various input in Linux :)
라는 flag 값을 확인 할 수 있다.
'CTF 스터디' 카테고리의 다른 글
[pwnable.kr] 9번_ mistake 풀이 (0) | 2021.04.23 |
---|---|
[pwnable.kr] 8번_ leg 풀이 (0) | 2021.04.23 |
[pwnable.kr] 6번_random 풀이 (0) | 2021.04.05 |
[pwnable.kr] 5번_ passcode 풀이 (0) | 2021.03.31 |
[pwnable.kr] 4번_ flag 풀이 (0) | 2021.03.30 |