ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LEVEL 13 bugbear write-up
    System hacking training/Hackerschool LOB 2018. 4. 26. 01:54

    darkknight -> bugbear


    [문제 + 힌트]



    문제를 보면 bof는 터지지만 argv[1][47]의 값이 bf라면 예외처리가 되며 종료되기 때문에

    ret에 스택의 주소 말고 다른 영역의 주소를 적어야할것같다.


    힌트 부분을 보면 알다시피 이 문제는 RTL을 이용하여 풀면된다.


    [Link - RTL 이란?]


    페이로드는


    `python -c 'print "A(dummy)" * 44 + "system() address" + "dummy 값" * 4 + "/bin/sh\00"'`


    이런식으로 구성하면 된다.


    이 페이로드를 작성하기 위해 준비물이 필요한데

    system()의 주소와 system()에 인자로 줄 /bin/sh\00가 필요하다.


    그전에 이 바이너리가 static linked 인지 dynamic linked 인지 알기 위해 file 명령어로 확인하였다.



    이 바이너리에 대한 정보중 dynamic linked 즉, 공유라이브러리를 사용하는 바이너리임을 알 수 있다.

    이로써 위의 바이너리에서 사용되지 않은 system()를 사용할 수 있다.


    gdb를 이용하여 system()의 주소를 구할 수 있다


    만약 ASLR이 걸려있다면 주소가 계속 변경되기 때문에 libc base주소를 구하고 여기에 system()의 offset을 구하여 익스해야하지만

    ASLR이 걸려있지 않기 때문에 그냥 ret에 넣어주면 된다.


    이제 /bin/sh\00을 인자로 넘겨주기 위해서 dummy값 4byte를 넣어주는데

    이 위치에는 다음에 return 할 주소를 가리키고 있기 때문이다.


    다음에 return 할 주소가 없기때문에 AAAA (dummy)로 채워줬다.


    이제 system()에 인자로 줄 /bin/sh\00 문자열을 찾아보자.



    먼저 libc 파일의 이름을 알기 위해 ldd 명령어로 이름을 찾고 libc의 base address도 구해준다.

    (/bin/sh\00의 문자열을 찾아 offset을 더할 목적)



    objdump -s 옵션을 줘서 /bin/sh\00의 offest을 구해보니

    0xe8778의 offset을 가진 /bin/sh\00 문자열을 찾아냈다.


    이 offset을 libc base 주소에 더하면 이 문자열에 대한 주소가 나오는데 그 주소는 0x40100778이다.

    (libc : 0x40018000 + offset : 0xe8778 = 0x40100778)


    이제 익스플로잇에 필요한 준비물들을 다 구했으니


    익스해보자.



    이상 풀이를 마친다.

    반응형

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

    LEVEL 15 assassin write-up  (0) 2018.05.13
    LEVEL 14 giant write-up  (0) 2018.05.12
    LEVEL 12 darkknight write-up  (0) 2018.04.22
    LEVEL 11 golem write-up  (0) 2018.04.20
    LEVEL 10 skeleton write-up  (0) 2018.04.11
Designed by Tistory.