본문으로 바로가기

level 9

category FTZ-write up 2020. 2. 24. 18:38

<!doctype html>

암호: apple

 

hint

 
 
 
 

 

 

코드 해석

 
 
 
 

 

소스를 분석해본 결과 분명 buf에는 10바이트의 값을 지정해줬는데 40의 데이터를 넣을수있게 해놨으며 또 비교 변수는 buf2인것을 볼수 있습니다.

 

정리해보자면 buf변수에 데이터를 많이넣어 그데이터들이 buf2까지 들어가게끔 하면됩니다

 

그것이 bof 핵심입니다!

 

 

의심스러운 실행파일 찾기

 
 
 
 

 

  • level 10이 소유하며 사용권한이 4000이 포함된 파일들이고 표준에러안뜨는 파일 찾기

    즉 쉽게말하면 setUID가 포함된 파일들을 찾는것이며

    -> 결국 의심스러운 파일을 찾을때 쓰인다

 

 

검색결과

 
 
 
 

 

실행결과

 
 
 
 

 

그럼 이제 소스를 분석해봅시다

 

먼저 hint의 소스들을 따로 파일로 만들어줍니다

(주의! tmp 디렉토리에서 만들어야 저장 오류가 안남)

 
 
 
 

 

 
 
 
 

 

그뒤 gcc 명령어 사용으로 소스코드를 컴파일

->디버깅이 가능하려면 컴파일을 해줘야한다

 

 
 
 
 

 

  • gcc?

    $ gcc -g -o <실행파일 이름> <소스코드 이름>

 

이후 gdb를 사용해서 분석

 
 
 
 
  • gdb?

    대표적으로 어셈블리어를 보고 분석할수 있게 해준다

 

intel언어로 바꿔 보기 편하게 설정

 
 
 
 

 

main 함수를 assembly어로 표현

 
 
 
 
 
 
 
 

 

 

여기서 핵심적으로 볼곳은 buf와 buf2의 주소를 알수있는 부분이면된다

따라서 buf의 주소를 알수있는 fget 부분과

buf2의 주소를 알수있는 strncmp 부분을 살펴봅시다

 

  • push,lea,call?

    -push: 오른쪽값을 스택에 쌓는다(주로 call 등장하기전에 사용된다)

    -lea: 오른쪽값의 주소를 넣는다(mov는 주소의 값을 넣음)

    -call:접근할 함수 주소로 이동하여 실행

 

 
 
 
 

fgets(buf,40,stdin);

 

소스코드와 어셈블리어를 비교해 보자면 소스의 오른쪽에서 왼쪽으로 해석이 되는것을 볼수있는데

 

먼저 <main+35> 는 stdin라는 표준입력방법을 push로 넣어주며

<main+41>은 0x28(십진수로 40)만큼의 공간을 넣어준다

<main+43>에서는 [ebp-40] 즉 buf의 주소를 넣어준다

 

따라서 buf 의 주소는 ebp-40

 

 
 
 
 

if ( strncmp(buf2, "go", 2) == 0 )

 

<main+58>은 2값을 넣어주고

<main+60>에서는 0x804856a(go를 의미)를 넣어줍니다

마지막으로<main+65>에는 buf2의 주소인 [ebp-24]의 주소를 넣어주어

 

buf2의 주소는 ebp-24

 

따라서 buf와 buf2의 거리는 16바이트이며 따라서 buf에 16바이트를 넣어주고 뒤에 go를 입력하면 buf2에 go가 입력되어 쉘 권한을 얻게 되어 문제를 풀게된다

 

 
 
 
 

 

마지막으로 my-pass를 하면 level10으로가는 password를 얻게된다!