ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ELF Technique - RTL Chaining
    System hacking training/Knowledge 2018. 2. 22. 21:49

    RTL Chaining 이란


    RTL 기법을 응용하여 라이브러리의 함수의 호출을 연계하는 것입니다.


    RTL 기법에서는 하나의 함수만 호출하였다면, RTL Chaining에서는 여러 함수를 연계하여 호출하는 것을 말합니다.


    [Link] RTL(Return To libc)


    이전의 RTL에서는 return address가 들어가는 곳에 AAAA(dummy(4))를 넣어줬었는데요.


    바로 이 AAAA를 넣어줬던 위치에 pop ret 과 같은 명령어의 주소를 넣어 스택 포인터를 다음 함수로 위치시키는 기법이


    RTL Chaining입니다.



    [실습]

    먼저 실습환경은 pwntool 사용을 위해

    우분투 64bit 환경에서 바이너리를 32bit로 컴파일 하였다.


    먼저 취약한 바이너리부터 만들어줍니다.



    read()로 buf에 512byte만큼 문자를 받음으로서 총 크기 256byte인 buf의 범위를 초과하여

    overflow가 일어납니다.


    메모리 보호기법은 NX bit를 제외한 모든 보호기법을 해제하여 컴파일 해줬습니다.



    RTL Chaining은 여러 함수를 연계하여 호출하는 것이므로


    저는 read() -> system() -> exit()를 연계하여 쉘을 실행시킬것입니다.


    따라서 read() 의 주소, system()의 주소, exit()의 주소가 필요하고, /bin/sh 문자열이 들어갈 메모리 공간, Gadget이라는 녀석이 필요합니다.


    ※Gadget

    Gadget이란 사전적 의미는 특별한 이름이 붙어 있지 않은 작은 기계장치나 부속품따위를 말합니다.

    RTL Chaining에서의 Gadget은 '스택 포인터를 다음 함수의 주소로 이동시켜주는 코드 조각' 이라고 말할 수 있습니다.

    이를테면 pop pop ret 과 같은 코드들의 모음을 말합니다.


    그리고 /bin/sh가 들어갈 메모리 공간이 필요한데

    저는 bss영역에 /bin/sh\00(총 8byte)을 넣어주었습니다.


    bss 영역은 변하지 않는 스택이고, Custom stack이라고 불리는데



    따라서


    먼저 각 함수의 주소를 gdb를 이용해 구해보았습니다.



    start로 임의로 bp를 걸고 실행한다음 p 명령어로 각 함수의 주소를 확인했습니다.


    그 다음으로 필요한 /bin/sh를 넣어줄 bss의 주소를 구해보았습니다.



    objdump -h 옵션을 주어 bss의 주소를 찾을 수 있었습니다.


    그리고 마지막으로 read() 인자 정리 용도로 pop pop pop ret Gadget과

    system() 인자 정리 용도 pop ret Gadget이 필요합니다.


    이 Gadget을 objdump -d (파일명) | grep -B3 ret 로 찾을 수 있었습니다.


    구한 pppr (pop pop pop ret) Gadget과 pr (pop ret) Gadgetd의 주소는



    pppr은 0x80484a9, pr은 0x80484ab입니다.


    필요한것들을 다 구했고


    시나리오를 작성하면 이렇습니다.


    [시나리오]

    1. bof를 일으켜 ret에 read()의 주소를 덮어준다.

    2. bss에 /bin/sh을 쓴다.

    3. system()를 호출하고, 인자로 bss의 주소를 넘겨준다.

    4. 마지막으로 exit()를 호출하고 끝낸다. (그 다음 return address는 AAAA 로 넣어줬다.)


    이 시나리오에 따라 pwntool을 이용하여 페이로드를 작성하였습니다.



    [페이로드 설명]

    260만큼 buf 와 SFP 덮고, ret 주소를 read()의 주소로 덮어쓴다.

    이후 read()가 종료되고 return 할 주소에 pppr Gadget을 넣어주고, 인자에 파일디스크립터 0,

    bss의 주소에 /bin/sh\00 (== 총 8byte)을 넣어주고 system()로 return을 하여 bss에 있는 /bin/sh을 system()의 인자로 전달하여

    쉘을 실행한 후 exit(0)으로 종료한다.


    반응형

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

    ELF Technique - GOT Overwrite  (0) 2018.02.28
    ELF PLT & GOT  (1) 2018.02.27
    ELF Technique - RTL(Return To Library)  (0) 2018.02.16
    gdb 명령어  (0) 2018.02.13
    ELF Memory Protection - DEP/NX  (0) 2018.02.10
Designed by Tistory.