ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LEVEL 15 assassin write-up
    System hacking training/Hackerschool LOB 2018. 5. 13. 15:37

    giant -> assassin

    [문제 + 힌트]

    소스코드 먼저 분석을 해보면 argc가 2이상 즉 인자값이 2개 이상이여야하고 argv[1][47] 가 \xbf 혹은 \x40이면 안된다.

    저 말은 return 할 주소가 \xbf 로 시작하는 스택의 어느 공간도 안되고 \x40으로 시작하는 코드영역도 안된다는 것이다.

    그리고 취약점은 strcpy()의 사용으로 인해서 bof가 터진다.

    그 후 memset()로 buffer+SFP를 0으로 초기화하면서 프로그램이 종료된다.

    이 문제는 간단하게 ret가젯을 이용하여 쉽게 우회가 가능하다.

    ret의 주소는 \xbf도 \x40도 아니기 때문에 ret 가젯을 이용하여 system()를 불러오던 환경변수에 쉘코드를 넣고 쉘코드를 실행시키던 할 수 있다.

    objdump -d 옵션을 주어 ret 가젯을 찾은 뒤 이 중 아무 주소나 골라서 ret 공간에 넣어주고 그 다음에 실행할 주소를 넣으면 되는데

    첫번째 방법은 환경변수의 주소를 넣는것이다.

    환경변수를 구하는 프로그램을 만들고 ret가젯의 주소를 ret공간에 넣어준뒤 쉘코드가 들어간 환경변수의 주소를 다음으로 넣어주면 쉽게 익스가 가능하다.

    두번째 방법은 system("/bin/sh"); 방법인데.

    RTL기법을 이용하여 익스가 가능하다.

    RTL기법을 하기 위해 필요한 준비물들은 다음과 같다.

    libc base address, system() address, /bin/sh offset

    먼저 libc의 base 주소와 /bin/sh의 offset을 구해보자.

    ldd 명령으로 바이너리가 사용하는 공유 라이브러리의 주소를 얻어오고 이 공유 라이브러리에서 /bin/sh 문자열을 찾으면 해당 offset값을 얻을 수 있다.

    여기서 libc base address : 0x40018000

    /bin/sh offset : 0xe81c0 + 7 = 0xe81c7

    따라서 /bin/sh의 주소는 libc base address에 offset을 더한 401001c7가 된다.

    이제 system()의 주소만 알면 된다.

    tmp 디렉터리에 assassin 파일을 복사한 뒤 gdb로 쉽게 알아올 수 있다.

    따라서 system() address : 0x40058ae0

    필요한 것들을 구했으니 이제 페이로드를 구성하면 다음과 같다.

    python -c 'print "A"*44+"ret가젯"+"system() address"+"dummy(4byte)"+"/bin/sh address"'

    익스를 해보면

    쉘을 띄울 수 있다.

    이상 풀이를 마친다.

    반응형

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

    LEVEL 17 succubus write-up  (1) 2018.05.17
    LEVEL 16 zombie_assassin write-up  (0) 2018.05.13
    LEVEL 14 giant write-up  (0) 2018.05.12
    LEVEL 13 bugbear write-up  (0) 2018.04.26
    LEVEL 12 darkknight write-up  (0) 2018.04.22
Designed by Tistory.