보안 공부하는 꼬깔이

FTZ level15 풀이

 

 

 

level15 홈디렉토리의 내용이다. level16의 권한으로 setuid가 걸린 attackme 프로그램 존재

 

hint 파일을 열어보자

 

hint 파일에 c언어 소스코드가 있었다.

 

소스코드를 해석해보자

 

 

 

14번 문제와 동일한 코드에서 check 변수를 포인터로 변경했다. 포인터 변수는 메모리의 주소 값을 저장하는 변수이다.

그렇다면 check에 들어가는 값은 메모리의 주소 값으로 저장되며, check 포인터 변수에 있는 값이 가리키는 메모리 주소에

0xdeadbeef를 넣어줘야 문제가 풀릴 것이다.

 

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

1 : buf[20]에서 부터 *check 까지의 거리

2 : 디버깅을 통해 0xdeadbeef 주소 알아오기

3 : *check 포인터 변수에 존재하는 메모리 주소에 0xdeadbeef 덮어 씌우는 페이로드 작성

 

우선 buf[20]에서 부터 *check 까지의 거리를 구해보자

 

디버깅을 위해 attackme 파일을 /tmp 폴더로 복사

 

 

0x080484a1 <main+17>:   lea    eax,[ebp-56] 해당 부분으로 buf에서 ebp까지의 거리를 구할 수 있다.

 

buf[20] 에서부터 ebp 까지의 거리 = 56

0x080484ad <main+29>:   cmp    DWORD PTR [ebp-16],0xdeadbeef 해당 부분은 조건문에서 *check 포인터와 0xdeadbeef 값을 비교하는 부분이다.

 

*check 에서부터 ebp 까지의 거리 = 16

 

 

buf[20]에서 *check까지의 거리 = (buf에서 ebp까지의 거리) - (*check에서부터 ebp까지의 거리) =  56 - 16 = 40

 

 

이제 메모리 상에서 0xdeadbeef가 존재하는 위치를 알아보자

 

 

0x080484b0 <main+32>:   cmp    DWORD PTR [eax],0xdeadbeef 해당 부분은 0xdeadbeef 와 *check를 비교하는 부분이다.

 

이 부분은 x/10x 0x080484b0 명령어로 해당 주소로부터 10바이트까지의 주소를 출력시켜서 확인 후 찾아보자

 

 

0xdeadbeef 값이 존재하는 주소가 0x80484b2 라는것을 알았다.

 

 


이제 본격적으로 페이로드를 작성해보자.

 

페이로드는 [buf[20]에서부터 *check 까지의 거리] + [check(0xdeadbeef)주소] 이런식으로 작성할 것이다.

 

최종적으로 페이로드는 (python -c 'print "\x90"*40+"\xb2\x84\x04\x08"';cat) | ./attackme

 

성공적으로 *check 포인터 변수에 저장된 주소를 0xdeadbeef 주소로 덮어 씌웠고 /bin/sh 쉘이 실행되었다. 그리고 my-pass

명령어로 level16의 패스워드를 출력시켰다.

 

level15 clear ~

 

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

FTZ level17 풀이  (0) 2017.07.04
FTZ level16 풀이  (0) 2017.07.04
FTZ level14 풀이  (0) 2017.07.04
FTZ level13 풀이  (0) 2017.07.04
FTZ level12 풀이  (1) 2017.07.04