ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Exploit tutorial] Corelan part 1 : Stack Based Overflows
    System hacking training/Windows 2018. 10. 3. 10:15
    윈도우 Exploit을 공부하던 중 Corelan 팀에서 작성한 문서를 발견했다.
    이 글은 Corelan 팀의 문서를 토대로 작성하였다.

    Easy RM to MP3 Converter에 존재하는 취약점을 예로 exploit을 작성해본다.
    해당 취약점은 .m3u 파일을 만든 후 파일을 로드하는 것으로 공격이 가능하다. (스택 기반 오버플로우)

    [구성환경]
    • OS : Windows XP sp 3 (ENG)
    • Language : python 2.7
    • Target : Easy RM to MP3 Converter

    [exploit db]


    [여기서 알고가야할 것]
    crash가 터진다고 무조건 exploit이 가능한 것은 아니다. 
    우리는 어플리케이션의 흐름을 통제하는 것이 목적인데 이것은 보통 다음에 실행될 명령이 위치한 포인터를 가진 EIP를 통제하는 것으로 이뤄진다.
    일반적으로 쉘코드를 실행하기 위해 EIP를 조작하는데 EIP가 쉘코드가 위치한 주소로 변조된다면 exploit이 성공하는 것이다.

    [메모리 구조]
    메모리 구조도 한번 훑고 가자.
    메모리는 3가지 부분으로 나눌 수 있는데, Code segment, Data segment, Stack segment로 나눌 수 있다.

    - code segment : 프로세서가 실행하는 명령. EIP는 다음 명령의 트랙을 가지고 있다. (.text)
    - data segment : 변수들, 동적 버퍼(.data, .bss)
    - stack segment : 함수에 데이터 or 인자를 전달하기 위해 사용 (스택 메모리에 직접 접근하기 위해 ESP를 사용)

    • Text segment : 읽기 전용. 고정된 크기로 어플리케이션 코드를 가지고 있다.
    • Data/bss segment : 쓰기 가능. 고정된 크기로 전역 변수, 정적 변수를 저장하는데 사용한다.
      - .data : 초기화된 전역 변수, 문자열, 상수 등
      - .bss : 초기화 되지 않은 변수
    • Stack : LIFO 구조를 가진 데이터 구조체. 높은 주소에서 낮은 주소로 자라난다.




    [발표 자료] 




    해킹을 하기 전 어플리케이션에 대한 이해는 필수다.
    이 프로그램은 2006년 부터 2010년 정도에 많이 사용을 했던 프로그램이고, 옛날에 우리가 mp3에 음악을 넣고 다닐 때 많이 이용을 하던 프로그램이다. 간단히 변환을 해주는 기능이 있다.

    이 프로그램 같은 경우 패치가 된 버전이 아직 나오지 않았고, 프로그램 사용률이 저조해지면서 자연스럽게 수면 아래로 가라 앉은 프로그램으로 보인다.

    다운로드 수 를 보면 예전에는 꽤 파급력이 있었던 프로그램이라는 것을 알 수 있다.


    exploit db에 poc가 올라와 있어 이를 통해 많은 정보를 알 수 있었다.
    먼저 11번 줄에서 junk에 의미 없는 데이터 "A"를 26000개 넣어주는데 이는 보통 우리가 Buffer Overflow를 할 때 가장 기본적으로 Buffer를 초과하는 과정이다.

    그리고 eip라는 변수에 kernel32.dll에서 찾은 jmp esp 가젯을 넣어주고, shellcode에 NOP Sled와 함께 144byte의 쉘코드를 넣어준다.
    마지막으로 m3u 파일을 생성하여 쓰기 권한을 주어 넣어준다.

    여기서 알 수 있는것은 Direct eip overwrite가 가능하고, 대충 ret와의 거리가 26000정도라고 판단할 수 있다.

    Step 0. 디버깅 설정
    >> 분석을 하기 전 디버깅 설정을 해주자.


    분석을 좀 더 쉽게 하기 위해 먼저 사후 디버깅 설정을 해준다.

    [post-mortem 설정]
    windbg -I

    이를 해주면 프로그램이 죽었을 때 디버깅을 할 수 있도록 만들어준다.

    Step 1. Crash 확인
    >> 이제 Crash를 터뜨려 보고, 이를 확인 해보자.


    test.py파일을 다음과 같이 만들어준다.
    exploit db에서 26000여개 넣었을 때 Bof가 터지므로 조금 더 넣어줬다.



    이후 Script를 실행하면



    다음과 같은 파일이 생성된다.

    이제 이 파일을 로드해보면



    이처럼 eip 가 41414141로 변조된 것을 확인 할 수 있다.


    Step 2. Offset 확인
    >> Metasploit framework를 활용하자.

    Metasploit framework는 아주 유용한 기능을 제공하는데,
    현재 우리는 eip가 변조되는 것은 확인을 했지만 정확한 ret와 buffer간의 offset을 알지 못한다.
    따라서 offset을 찾기 위해 다음 두가지 스크립트가 있는데 다음과 같다.

    • pattern_create.rb : 임의의 패턴을 생성해준다.
    • pattern_offset.rb : offset을 찾아준다.

    Step 3. jmp esp 가젯 찾기
    >> strcpy(), strstr() 등 NULL byte를 문자열의 끝으로 인식하는 문자열은 NULL byte를 만나면 무조건 복사가 중지 되기 때문에 주소에 0x00 이 들어가면 안된다.

    여기서 jmp esp 가젯을 찾는 이유는 process stack의 주소에 NULL byte가 들어있었기 때문인데
    앞서 설명했듯 문자열을 다루는 많은 함수가 NULL byte를 끝으로 인식하기 이 과정이 필요하다.

    따라서 같이 올라온 dll에서 jmp esp 가젯을 찾기 위해 먼저 같이 올라온 dll 목록을 확인한다.

    [같이 올라온 DLL 확인]
    windbg -> process attach -> 같이 올라온 dll 확인

    이후 jmp esp 의 기계어를 찾고, 실행권한이 있는 dll에서 뽑아서 사용을 한다.

    이제 스택에 쉘코드를 넣고, eip를 jmp esp 가젯의 주소로 덮어고 exploit 하면 된다.

    cmd 쉘코드를 사용하여 exploit을 하였다.


    반응형

    'System hacking training > Windows' 카테고리의 다른 글

    0x1. PC 내부구조  (2) 2017.12.06
Designed by Tistory.