보안 공부하는 꼬깔이

FTZ level18 풀이

 

 

level 18의 홈디렉터리에 level19 의권한으로 setuid가 걸린 attackme 프로그램 확인

 

hint를 열어보자

 

 

힌트에는 전 문제들과는 다르게 엄청 복잡한 코드가 나왔다. 흠.. 최대한 해석해보도록 하자..

 

 

코드가 시스템에 관해 알아야할 내용이 많고 복잡해서 최대한 간단하게 설명하도록 하겠다.

 

소스에서 check 변수의 값이 0xdeadbeef 면 sheelout 함수를 호출해 level19권한으로 /bin/sh 셸이 실행된다. 하지만 string[100] 보다 check 변수가 뒤에 존재해 일반적인 BOF로는 문제를 해결할 수 없을것 같다.

 

여기서 가장 중요한 부분은 버퍼의 문자수를 조절해주는 count 변수가 0x08 입력이 들어오면 1감소하게 된다는 점이다.

 

그렇다면 배열의 인덱스가 -가 되도록 하면 앞의 메모리에 접근이 가능하게 될것이다. 즉, string[100]보다 나중에 존재하는 check 변수에 접근이 가능하다는 것이다.

 

 

어떤 식으로 문제를 해결할지 생각해보자

1 : string[100] 에서 부터 check 까지의 거리

2 : check 에 0xdeadbeef를 덮어씌우는 페이로드 작성

 

 

우선 string[100] 에서 부터 check 까지의 거리를 알아보자

 

디버깅을 위해 attackme 파일을 tmp/ 디렉토리로 이동

 

 

0x08048743 <main+499>:  lea    eax,[ebp-100] 이 부분을 확인하면 string에서부터 ebp 까지의 거리를 알 수 있다

 

string[100] 에서부터 ebp 까지의 거리 = 100


 

 

0x080485ab <main+91>:   cmp    DWORD PTR [ebp-104],0xdeadbeef 이 부분을 확인하면 check변수 에서부터 ebp 까지의 거리를 확인 할 수 있다.

 

check 변수 에서부터 ebp 까지의 거리 = 104


 

string 변수에서 부터 check 까지의 거리 = [string[100] 에서 부터 ebp 까지의 거리] - [check변수에서 부터 ebp 까지의 거리] = 100 - 104 = -4

 

생각대로 check 의 위치가 string 보다 앞에 위치해있다.

 

 

이제 페이로드를 작성해 보자

 

기본적인 페이로드는 [string에서부터 check 까지의 거리] + [0xdeadbeff값] 이다

 

여기서 참고 할 점은 string에서부터 check 까지의 거리인 -4 는 0x08을 입력시 버퍼의 문자수를 조절해주는 count변수가 -1 되는것을 이용해 역으로 돌아가는 방법을 사용해야 합니다.

 

최종적인 페이로드는 (python -c 'print "\x08"*4 + "\xef\xbe\xad\xde"';cat) | ./attackme

 

 

성공적으로 0x08 의 4회 입력을 통해 버퍼 인덱스가 -4 를 가르키게 되어 check 변수에 0xdeadbeef 값를 덮어 씌울수있게 되었다.

my-pass 명령어를 통해 level19 패스워드 출력

 

level 18 clear~

'System Hacking > FTZ' 카테고리의 다른 글

FTZ level20 풀이  (1) 2017.07.05
FTZ level19 풀이  (0) 2017.07.04
FTZ level17 풀이  (0) 2017.07.04
FTZ level16 풀이  (0) 2017.07.04
FTZ level15 풀이  (0) 2017.07.04