0. 후기

그닥 어렵지 않았다. level11과 level12를 풀어서 level13도 어렵지 않게 풀이를 생각해 냈다. 어느 정도 풀어놓고 level11부터 풀이를 쓰느라 잊고 있었는데 level13을 풀면서 main함수가 끝나고 복귀하는 부분을 조작하는걸 이 때 이해했다.

 

1. 문제 파악하기

바로 힌트부터 봤다. 

 

2. 코드 해석

#include<stdlib.h>

main(int argc, char *argv[])
{
    long i=0x1234567;
    char buf[1024];
    
    setreuid(3094,3094);
    // 프로그램을 실행할 떄 넣어준 인자의 수가 2개 이상이면 buf에 첫번째 인자를 넣어준다.
    if(argc>1)
    strcpy(buf,argv[1]);
    
    // 오버플로우가 발생하면 프로그램을 바로 죽임
    if(i != 0x1234567) {
    	printf("Warnning: Buffer OverFlow !!! \n");
        kill(0,11);
   }
}

 

level11과 같은 함수를 이용해서 프로그램의 인자를 복사하는건 같지만 오버플로우 발생 여부를 검증하는 코드가 추가됐다. 그러면 추가로 0x1234567까지 신경쓰면서 값을 덮어 써주면 된다.

 

3. gdb 확인

1048바이트 만큼 스택을 확보한 모습을 볼 수 있고, ebp-12가 i인 것도 확인할 수 있다. 변수 별 스택 크기를 예상해 보면 

buf : 1024 + 12(dummy)

i : 4 + 8(dummy)

이렇게 예상할 수 있다.

 

 

확인을 위해 프로그램 인자를 복사하고 오버플로우를 확인하는 부분(main+69)에 bp를 걸고 인자로 A문자 1024개 넣고 실행을 하면 

 

 

내가 예상한 것과 같이 쓸데없는 값이 들어가 있는 것을 확인 할 수 있다. 그리고 빨간거 두개가 앞에는 ebp이고 뒤에가 main 함수의 복귀 주소이다.

 

스택 상황을 정리해 보면 이렇다.

 

4. 귀환할 주소 찾기

level11에서 했던 것처럼 argv에서 쉘코드를 실행할 거기 때문에 argv위치를 찾아봤다. 찾기 위해서 내가 입력할 페이로드만큼 A를 넣어야 한다.

그래서 1056(1048 + 4 + 4)만큼 A 문자를 넣어줬다. 그리고 중간에 0x1234567이 잘 들어가는지도 확인해 보기 위해 넣어 봤다. 

잘 들어간다.

 

5. 페이로드 작성

위에 귀환할 주소를 토대로 페이로드를 작성했다. 

"\X90"을 1011개 넣은 이유는 1036바이크 만큼의 크기에서 25바이트는 쉘코드를 넣어야 하기 때문이다.

그 뒤에 쉴코드를 넣고, 바로 0x1234567도 넣어준다.

그리고 아무 문자 12개 넣어주고 복귀할 주소를 넣어줬다.

 

6. 정답

'문제 풀이 > Hackerschool FTZ' 카테고리의 다른 글

FTZ - level12  (1) 2024.09.25
FTZ - level10  (0) 2024.08.03
FTZ - level9  (0) 2024.08.02
FTZ - level8  (0) 2024.08.02
FTZ - level7  (0) 2024.07.31

0. 후기

이건 한참을 붙잡고 있어도 푸는 방법이 안떠올라서 결국 다른사람들의 풀이를 봐버렸다. 떠올리지 못할 방법이긴 했다. 환경 변수를 통해서 풀었는데 이 방법에 대해서 더 찾아봐야 겠다.

 

1. 문제 파악하기

일단 힌트부터 확인했다. 코드를 딱 봤을 때 level11과 다른점은 프로그램 안에서 입력값을 받는다는 점만 다르고 나머지는 같다고 생각했다.

 

2. gdb 확인하기

일단 level11에서 했던것처럼 main 함수가 끝나고 복귀할 주소를 덮어써서 쉘코드를 실행하려고 스택의 구조를 파악하였다. level11와 같이 264만큼의 크기를 확보하고 있는 모습이다.

 

3. 문제 발생

여기쯤에서 문제가 발생했는데, 쉘코드를 입력한 값이 스택에 저장되는데 이 스택 주소값이 계속 바뀌었다. 그래서 찾아보니가 메모리 보호기법 중에 ASLR이라고 있는데 스택의 주소를 프로그램이 실행될 때 매번 다르게 바꿔주는 기법이라고 있었다. 그래서 스택의 주소가 계속 바뀌나보다 싶어서 ASLR을 푸는 방법이 뭐가 있나 찾아보고 해봤는데 생각해보니까 level11에서도 스택의 메모리가 계속 변하는거 보니 이 방법이 아닌것 같다고 생각했다.

 

4. 환경 변수 생성

그래서 고민을 계속하다가 포기하고 다른 사람들 문제를 보았다. 환경 변수를 통해 풀던데 이 방법은 level11을 풀고 나서 다른 사람들 풀이를 볼 때 봤던 거긴 했는데 뭔가 방법이 맘에 안들어서 따로 더 안찾아봤던 방법이었다. 여러개를 찾아봤지만 다들 이 방법을 사용하길래 나도 사용했다.

 

환경 변수에 쉘코드를 넣어줬다. \x90을 30개나 넣어준 이유는 약간의 오차가 생기더라도 NOP slide를 통해서 실핼될 수 있도록 넣어줬다.

 

그리고 환경변수의 주소를 출력하는 코드를 만들어 주고.

 

프로그램 실행을 통해 환경 변수의 주소를 알아냈다.

 

5. 페이로드 작성

페이로드는 268바이트(264+ebp)만큼 대충 채워주고, 그 뒤에 4바이트에 환경변수의 주소를 넣어줬다. 프로그램이 실행되는 동안 입력값을 받는 경우에 어떻게 python을 통해 값을 넣어 주는지도 알게 되었다. 

 

6. 정답

 

'문제 풀이 > Hackerschool FTZ' 카테고리의 다른 글

FTZ - level13  (0) 2024.09.26
FTZ - level10  (0) 2024.08.03
FTZ - level9  (0) 2024.08.02
FTZ - level8  (0) 2024.08.02
FTZ - level7  (0) 2024.07.31

0. 후기

이번에도 역시 운으로 푼 느낌이다. 원래 다들 이런식인가?

 

1. 문제 파악

힌트 내용이다. 처음 봤을 때는 거의 다 모르는 내용이였다. 조금 시간을 두고 다시 보니까 키워드가 좀 보였는데, "공유 메모리"와 "소스는 지우고 나가주세요." 였다.

힌트

 

2. 공유 메모리 찾아보기

찾아보니까 프로세스에서 존재하는 데이터를 다른 프로세스에서 사용할 수 있도록 메모리를 공유하는 방식이고 이것을 IPC라고 한단다. 이렇게 특정 메모리를 공유하게 되면 데이터를 더 빠르게 접근할 수 있기 때문에 프로그램을 더 효율적으로 만들 수 있다고 한다.

https://reakwon.tistory.com/96#google_vignette

 

[리눅스] 공유메모리 (Shared Memory) 개념과 예제(shmget, shmat, shmdt, shmctl)

공유 메모리, 메시지큐 등 더 많은 정보와 예제를 담은 리눅스 교재를 배포했습니다. 아래의 페이지에서 리눅스 교재를 받아가세요. https://reakwon.tistory.com/233 리눅스 프로그래밍 note 배포 티스토

reakwon.tistory.com

https://whatdocumentary.tistory.com/24

 

공유 메모리(Shared Memory)

공유 메모리는 프로세스 간에 서로 공유하는 메모리 공간이다. 프로세스는 시작 시 혹은 실행 중에 이러한 데이터를 저장하고 사용하기 위한 메모리 공간을 커널에 요구하여서 할당받아 사용하

whatdocumentary.tistory.com

 

3. 코드 작성하기

힌트에서 작성한 소스는 지우고 나가달라기도 했고, 공유 메모리를 찾아보니까 대부분이 함수 설명하는 글이여서 일단 코드를 작성해봤다.

#include<sys/shm.h>
#include<sys/ipc.h>

int main(){
    int i = 0;
    void* addr;

    // 키 값이 7530인 이미 존재하는 공유 메모리에 접근
    i = shmget(7530, 0, IPC_CREAT);

    // 공유 메모리의 시작주소 받아오기
    addr = shmat(i, 0, 0);

    // 공유 메모리를 문자열로 출력
    printf("%s", addr);
}

 

 

4. 정답

코드를 컴파일하고 실행해봤다. 정답이다.

사실은 공유 메모리에 대해 찾아볼때 shmctl라는 명령어를 전달해서 제어하는 함수가 있었는데 이것도 해야될 생각에 좀 고민하다가 공유 메모리 시작부분에는 뭐가 뜨지? 라는 생각이 들어서 대충 문자열로 출력해 봤는데 이렇게 됐다.

'문제 풀이 > Hackerschool FTZ' 카테고리의 다른 글

FTZ - level13  (0) 2024.09.26
FTZ - level12  (1) 2024.09.25
FTZ - level9  (0) 2024.08.02
FTZ - level8  (0) 2024.08.02
FTZ - level7  (0) 2024.07.31

0.후기

bof는 드림핵에서 봤던 내용이여서 검색하기가 수월했다.

이것도 약간은 야매로 푼감이 없지않아 있다.

좀 찾아보니까 절반정도는 나처럼 해결한 거 같고 나머지 절반은 gdb를 통해서 해결한거 같다.

gdb 사용법좀 익혀야 하긴 하는데....

 

1. 문제 파악하기

힌트를 봤다.

힌트 내용

 

2. 코드 해석하기

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

main(){
	
    char buf2[10]
    char buf[10]
    
    printf("It can be overflow : ");
    // buf에 40바이트 만큼 입력받음
    fgets(buf, 40, stdin);
    
    // buf2와 "go"문자열을 2바이트만 비교함
    // 비교하는데 같을 경우
    if(strncmp(buf2, "go", 2) == 0)
    {
    	printf("Good Skill!!\n");
        // 아마 level10의 uid인거 같음
        setreuid(3010, 3010);
        // 쉘 실행
        system("/bin/bash");
    }
}

입력도 안받은 buf2를 "go"랑 비교하는거 보니 내가 입력하는 것을 통해서 오버플로우를 해야될거 같다.

 

3. 오버플로우 

일단 기억나는 정보로는 프로그램에서 변수는 스택에 저장되게 되는데 이게 위에 나오는 변수부터 쌓아가기 때문에 buf2가 buf밑에 깔리게 된다.

예상한 스택 내용

여기다가 12바이트만큼 데이터를 넣으면 뒤에 2바이트가 buf에 못들어가서 아래 깔려있는 buf2에 들어가게 된다.

예상한 구조에서 데이터를 넣었을 때

이런걸 예상하고 데이터를 넣어봤다. 안된다.

아 예상대로 안됐다

 

4. 코드 작성

예상대로 해서 안됐으니 직접 확인해 봤다. 코드는 이렇게 작성했다. 그냥 buf에 입력받고 buf2를 출력하는 코드다.

#include<stdio.h>
#include<stdlib.h>

int main(){

    char buf2[10];
    char buf[10];

    printf("input:");
    fgets(buf, 40, stdin);

    printf("%s", buf2);
}

A부터 Z까지 입력하니까 buf2는 Q부터 출력됐다. 그니까 17번째부터 buf2에 저장되는 것이다.

테스트1

이렇게 말이다.

테스트2

 

5. 적용하기

A부터 P까지 입력하기 귀찮으니 대충 16바이트 채워서 넣고 그 뒤에 go를 넣어 입력했다.

성공한 모습

어우 잘 됐다.

 

6. 정답

정답이다.

정답

'문제 풀이 > Hackerschool FTZ' 카테고리의 다른 글

FTZ - level12  (1) 2024.09.25
FTZ - level10  (0) 2024.08.03
FTZ - level8  (0) 2024.08.02
FTZ - level7  (0) 2024.07.31
FTZ - level6  (0) 2024.07.26

0. 후기

쉬웠다.

level1을 할 때 이상하게 삽질한 경험이 있었고, 문제를 풀기위한 환경도 다른 공부하느라 구축을 해놔서 쉽게 풀었다.

 

1. 문제 파악하기

hint 내용이다.

hint

 

2. 숨겨진 level9의 shadow 파일 찾기

2700"바이트" 크기를 가진 파일을 찾는 명령어이다.

find / -size 2700c 2>/dev/null

shadow 파일 찾기

found.txt 파일을 열여봤다. 익숙한 shadow 파일이 보였다.

shadow파일 내용

 

3. shadow파일 해석하기

중요한 것만 해석하겠다.

각 항목은 콜론(:)에 의해 구분된다.

사용자 계정은 level9

$1$vkY6sSlG$6RyUXtNMEVGsfY7Xf0wps. 이것은 암호화된 비밀번호다.

이 비밀번호도 달러사인($)으로 구분되는데 첫번째는 암호방식, 두번쨰는 salt, 세번째는 암호이다.

사실 문제 풀 떄 이거 몰라도 된다.

 

4. level9 비밀번호 복호화하기

전에 level1에서 삽질할 때 john 프로그램이란걸 알게됐는데 이 리눅스 shadow 파일을 복호화해주는 프로그램이다. 이 프로그램이 칼리 리눅스에 설치되어 있다고해서 딱 공부때문에 구축한 칼리서버가 있어서 거기서 복호화 했다.

 

이렇게 따로 파일로 저장해주고

복호화할 내용 저장

 

john [파일명]을 통해 복호화를 해준다.

john을 통해 복호화

 

이게 원래는 처음 복호화하면 바로 비밀번호가 뜨는데 이미 한번 했던거는 다른 곳에 저장된다.

복호화 된 암호는 이곳에 저장됨

 

5. 정답

정답이다.

apple이 정답

'문제 풀이 > Hackerschool FTZ' 카테고리의 다른 글

FTZ - level10  (0) 2024.08.03
FTZ - level9  (0) 2024.08.02
FTZ - level7  (0) 2024.07.31
FTZ - level6  (0) 2024.07.26
FTZ - level5  (0) 2024.07.26

0. 후기

구축했었던 FTZ 서버에 파일이 누락된게 있어서 제대로 풀어보질 못했다.

누락만 안됐으면 쉬운 문제였을거 같다.

 

1. 문제 파악

hint 내용이다.

hint

/bin/level7 프로그램을 실행시킨 결과다.

level7 실행

 

2. wrong.txt 파일이 없음

처음에는 wrong.txt 파일을 만들어서 뭘 해야되나 보다 싶어서 만들려고 했는데 실패했다.

touch 실패
vi 실패
리다이렉션 실패

 

3. 도저히 못하겠어서 다른 사람 풀이를 찾아봄

찾아보니까 개인이 FTZ 서버를 열어서 하는경우 생기는 wrong.txt 파일 누락

wrong.txt 파일 내용이다.

더보기

--_--_- --____- ---_-__ --__-_-

 

4. wrong.txt 파일 해석하기

하이픈은 1로 언더바는 0으로 대입하면 2진수가 나오게 된다.

더보기

1101101 1100001 1110100 1100101

나온 2진수를 10진수로 바꿔준다.

더보기

109 97 116 101

숫자를 보면 아스키코드의 알파벳 소문자 범위인걸 알수 있다. 아스키코드로 변환해준다.

더보기

m a t e

 

5. 정답

'문제 풀이 > Hackerschool FTZ' 카테고리의 다른 글

FTZ - level9  (0) 2024.08.02
FTZ - level8  (0) 2024.08.02
FTZ - level6  (0) 2024.07.26
FTZ - level5  (0) 2024.07.26
FTZ - level4  (0) 2024.07.26

0.후기

아 이번에는 답을 봐버렸다. 그래서 엄청 빨리 풀어버렸다. 그냥 검색만 좀 해보려고 했는데 뭔갈 보고 그걸 해보니 딱 풀렸다.

다음에 풀때는 혼자서 풀어보다가 검색을 해봐야겠다.

물론 여태까지 푼것도 혼자서 해보다가 검색해보긴 했는데.. 모르는게 있어도 혼자서 좀 풀어봐야겠다.

 

1. 문제 파악

이번에는 접속하자마자 hint가 뜬다.

 

2. 강제 종료?

검색하다가 슬쩍 본 Ctrl + C를 눌러 실행중인 프로그램을 종료시킨다. 그럼 터미널로 간다.

 

3. 문제 파악하기

ls -l을 입력해 뭐가 있는지 확인해본다. 정답같은 password 파일이 있다.

 

4. 정답

cat password를 입력해 파일을 봤다.

'문제 풀이 > Hackerschool FTZ' 카테고리의 다른 글

FTZ - level8  (0) 2024.08.02
FTZ - level7  (0) 2024.07.31
FTZ - level5  (0) 2024.07.26
FTZ - level4  (0) 2024.07.26
FTZ - level3  (0) 2024.07.24

0. 후기

뭔가 항상 문제를 운으로 푸는거 같다.

이번 문제는 엄청 빨리 풀었다.

 

1. 문제 파악하기

바로 힌트를 봤다.

힌트

level5 프로그램 정보다.

level5

/tmp 디렉터리에는 level5.tmp 파일이 없다.

/tmp/

 

2. level5 프로그램은 어떤 프로그램인가

일단 setuid라는 특수한 권한을 가진 프로그램이다. 이 프로그램은 실행되면 level6의 권한으로 실행되고 프로그램이 종료되면 다시 level5으로 돌아온다. 그리고 level5의 권한으로는 수정도 못하고 읽지도 못한다.

level5

프로그램을 실행시켜봤다. 아무런 반응도 없다.

level5 실행

/tmp 디렉터리에 들어가서 임시파일이 있나 확인해봤다. 없다.

생성된 임시파일이 없다.

여기까지 해보고 유추한 내용은 좀 뻔한 이야기이지만 level5프로그램이 실행되고 /tmp에 level5.tmp 파일을 만들고 프로그램이 종료될 때 다시 level5.tmp파일을 지우는 것 같다.

그리고 딱히 인수도 받지 않는 거 같았다.

인수를 넣어봐도 별 반응 없음

 

3. level5.tmp의 실물을 보고싶다.

level5.tmp 파일을 구하는게 뭔가 이 문제의 핵심인거 같았다. 그래서 프로그램이 실행되고 종료되기 전에 프로그램을 멈추고 싶었다. 그래야 level5.tmp를 생성한다음 삭제를 안할테니까.

방법을 찾아봤지만 딱히 안나왔다.

 

뭐가 안나와서 임시파일에 대해 찾아보고 있었는데 tmp 디렉터리는 누구나 파일이나 디렉터리를 생성할 수 있는 공간이라는 정보를 알게되었다.

나는 여태까지 뭔갈 작성해야만 풀리는 문제만 이 파일을 생성할 수 있는 권한을 준다고 생각했는데 다시 생각해보니까 level4에서도 tmp 디렉터리에서 코드를 작성했었다.

 

이러한 사실을 알고 /tmp 디렉터리에 touch level5.tmp 명령어를 통해서 level5.tmp 파일을 만들고 level5 프로그램을 실행해 봤다.

level5.tmp 파일 생성

 

4. 정답

뭐 당연히 지워져 있겠지 생각한 상태로 확인해 봤다. 아니면 지워지지 않더라도 아무것도 달라지는게 없겠지 생각했다. 근데 파일 크기가 달라져 있었다.

이이 엄청난 변화

바로 확인해 봤다. 다음 비밀번호다.

 

5. 추가

정답을 발견할 때 까지는 왜 이러는지 이유를 몰랐지만 살짝 더 생각해 보니까 권한 때문에 풀린거 같다.

level5 프로그램이 setuid 때문에 level6의 권한으로 실행하게 되는데 이 때 level6는 level5가 생성한 파일을 삭제할 권한이 없어서 삭제를 못하고 남는거 같다.

'문제 풀이 > Hackerschool FTZ' 카테고리의 다른 글

FTZ - level7  (0) 2024.07.31
FTZ - level6  (0) 2024.07.26
FTZ - level4  (0) 2024.07.26
FTZ - level3  (0) 2024.07.24
FTZ - level2  (0) 2024.07.23

+ Recent posts