ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LOB] Orge -> Troll Write-up
    표튜터와 함께하는 Pwnable/The Lord Of the BOF Write-up 2019. 2. 10. 01:49

    혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다.


    이번 문제를 풀면서 생각보다 많은 시간이 들었다.

    argv[0]를 사용해야한다는 것은 알았는데 "\x2f" 가 복병이었고

    심볼릭 링크를 이용해야한다는 것도 복병이었다...허허..


    지금부터 풀이를 시작해보겠다.

    추가된 코드들을 확인해보자


    우선 인자는 argv[0], argv[1] 두 개를 사용할 수 있으며

    argv[0]는 기본적으로 파일명이다.


    하나 더 추가된 코드를 보면 argv[1]를 그 길이만큼 0으로 memset해주고 있다.

    이전 풀이처럼 argv[2]는 우선 사용할 수가 없다.


    그렇다면 우리는 쉘코드를 어디에 넣어야할까??

    argv[1]은 초기화되며 길이도 제한이 있기 때문에 더이상 쉘코드를 넣을 수가 없다


    그렇기 때문에 떠올린 것이바로 argv[0]를 이용하면 되겠다고 생각했다.

    그러기 위해서 일단은 troll이라는 파일을 디버깅하기위해 trorr로 복사하였다.



    모든 초기화 작업이 끝난 뒤 스택을 보기 위해서 breakpoint를 거의 마지막에 걸어놓았다.

    argv[0]를 확인하기위해 메모리를 다 뒤져봤다.




    argv[0]의 값을 확인할 수 있었고




    유저영역의 주소 마지막 쯤에 하나 더 확인을 할 수 있었다.



    이제 argv[0]를 조작해보자. 그저 파일이름을 shellcode로 조작해주면 된다.

    하지만 argv[0]의 정확한 주소를 놓칠 수도 있으니 nop sled를 같이 사용해주자


    내가 사용한 쉘코드는 아래와 같다.

    \xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb

    \x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a

    \x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81

    이러한 쉘코드를 흔히 다형성 쉘코드라고 한다.


    다형성 쉘코드는 쉘코드를 암호화시키고 실행 전에 복호화시켜서 

    기존의 쉘코드의 모양을 다르게 만들어 숨기는 쉘코드를 의미한다.

    그렇기 때문에 기존의 쉘코드에 비해 길이가 길어지며 실행 시마다 코드의 내용이 변화한다.


    처음에는 다른 쉘코드를 사용하였는데 파일이름에 "\x2f"가 들어가게되면

    그 의미가 " / " 가 되어서 디렉토리 구분인자로 인식되어버리기 때문에 이름을 제대로 바꿀 수가 없다.

    그렇기 때문에 "\x2f"가 없는 쉘코드를 사용해서 nop과 함께 생성해준다.




    생성할 때 심볼릭 링크를 이용해서 만들어준다.

    이제 생성한 파일을 실행시켜보자 인자는 일단 "0xbffffffff"로 주었다.


    심볼릭 링크란 원본파일의 이름을 그대로 가리키는 링크이다. 

    그렇기 때문에 원본파일이 사라지면 제대로된 역할을 수행할 수가 없다.

    장점은 파일의 내용이 전혀 다른 파일이더라도 이름이 같으면 계속사용이 가능하다는 점이다.

    예를 들어 test라는 파일을 a라는 이름의 파일로 심볼릭 링크를 걸었다면

    a는 test가 사라지면 사용할 수 없다. 하지만 test라는 이름의 파일을 다시 생성하면

    그대로 사용이 가능하다는 뜻이다.


    이와 다른 방법의 link로는 하드 링크가 있다.



    하드링크란 원본파일과 동일한 inode를 가지는 하드링크는 원본파일이 삭제되더라도 사용이 가능하다.

    그 이유는 당연히 원본 파일의 inode를 가지고 있는 링크파일이기 때문이다.

    쉽게말해서 같은 inode를 가리키고 있는 다른이름의 파일이라고 생각하면 편하다. 

    원본이라는 개념이 의미가 없다. 



    Segmentation fault가 떴고 core파일이 dump되었다.



    core파일에서 argv[0]의 nop과 쉘코드를 찾아보자!! 

    대충 0xbffffa60 부근에서 nop이 보이고 그다음에 쉘코드가 보인다.

     그러므로 nop sled를 하기위해 근처의 주소를 그대로 넣어주면된다.



    주소값을 "\x70\xfa\xff\xbf"로 넣어주었다. nop sled가 일어나서 쭈욱~~ 쉘코드가 실행됨을 볼 수 있었다.

    이건 trorr파일이므로 이전과정과 마찬가지로 심볼릭링크를 troll에 걸어주고 실행시켜주면된다.



    다음 단계로~~


    반응형

    댓글

Designed by Tistory.