ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LOB] Zombie_Assassin -> Succbus Write-up
    표튜터와 함께하는 Pwnable/The Lord Of the BOF Write-up 2019. 3. 14. 02:17

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



    이번 문제는 생각보다 너무 쉬웠당~

    우선 코드를 보자~



    < Main >

    Main 함수를 보게되면 우선적으로 공유라이브러리를 사용할 수 없도록

    '\x40'을 검사하는 제약을 걸어두었고 addr가 DO 함수의 주소가 아닌 경우에

    이 또한 프로그램을 더 이상 진행하지 못하도록 하였다.

    또한 ret부분을 제외한 나머지 버퍼들을 초기화 시켰다.


    ret값에 DO함수의 주소값과 비교해서 다르면 더 이상진행할 수가 없었으므로

    덮어쓸 ret에 넣어줄 DO함수의 주소값을 가진 녀석이 필요하다는 것을 알 수 있었다.


    <함수 MO, YOT, GUL, GYE, DO>

    함수들의 정의를 보니 전역변수 check값으로 조건문을 통과할 수 있음을 알 수 있었다.

    연쇄작용처럼 DO, GYE, GUL, YUT, MO 함수가 진행되어야하며

    마지막에 MO함수에 있는 system함수를 이용하는 문제라는 것을 알 수 있었다.

    그러므로 DO함수뿐만아니라 모든함수의 주소를 구해야했다.



    함수의 주소를 구하는 방법은 여러가지가 있다.

    objdump나 gdb의 print, readelf, 그리고 어셈블리어 코드를 보고 직접찾기 중 원하는걸 사용하자



    < objdump 사용 >

    ,



    < gdb의 print >



    < readelf 사용 >



    < 어셈블리어 코드 보고 찾기 >

    memcmp 전에 넘겨지는 인자들을 보고 addr을 유추


    MO함수의 주소임을 확인



    주변을 뒤져보니 함수들이 존재함


    깔끔하게 찾았지만 그냥 이전의 방법들을 사용하자^^



    이렇게 우리가 필요한 함수들의 주소를 모두 찾았다.


    그렇다면 이제 Payload를 구성해보자

    Payload = "a"*44 + &DO + &GYE + &GUL + &YUT + &MO + dummy(4) + &"/bin/sh"+"/bin/sh"

    이런식으로 RTL의 개념으로 함수들을 실행시켜야한다. 그렇게되면

    함수의 실행에 따라 check 값들이 조건문을 통과하면서 결국엔

    MO함수의 System함수가 작동될 것이다. 이제 남은 것은 "/bin/sh"를

    System함수의 인자로 넘겨주는 것이다. 우선 Payload를 진행해보았다.

    dummy 와 "/bin/sh"의 주소는 각각 "bbbb" 와 "cccc"로 주었다.



    역시 Segmentation fault가 일어났다. core파일을 확인해보자



    오잉? 인자로 입력한 "/bin/sh"이 보인다. 초기화되지 않은 부분이 있다는 것을 확인할 수 있었다.



    초기화되지 않은 이유는 바로 제일 위의 Succubus.c 코드를 보면 알 수 있다.

    memset에서 ret 이후부터 100byte는 초기화하는 영역에 들어가지 않았기 때문이다.

    그렇기 때문에 우리는 이 영역을 사용해서 공격을 할 수 있는 것이다.




    정확히 "/bin/sh"의 주소를 확인하였다.

    "/bin/sh" 의 주소 = 0xbffffa98



    인자로 넣어주니 쉘이 따졌다~~



    복사본이 아닌 원본에서도 쉘이 잘 따졌다~~


    다음 단계로~


    반응형

    댓글

Designed by Tistory.