ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • misalignment Write-up
    System/Pwnable.xyz 2020. 1. 19. 03:40

    [그림 1] misalignment (50)

    이전 문제에 sub,add 두 문제의 연장선같은 문제다.

    sub,add,misalignment 세 문제 모두 단순 Arbitrary Write문제다.

     


    Binary

    [그림 2] file

    64bit ELF 바이너리이며, Shared Object로 PIE가 걸려있음을 알 수 있다.

     

    [그림 3] checksec

    Full Mitigation이 적용되어 있지만 쫄지말자

    출제자가 의도된 풀이로 인도하기 위한 장치라고 생각하면 된다.

     

    [그림 4] win( )

    win( )로 원샷 함수가 있기 때문에 간단한 익스가 가능하다.

     


    Problem

    [그림 5] main( )

    먼저 빨간박스에서 Arbitrary Write가 가능하다.

    v6,v7,v8 모두 scanf( )를 통해서 입력받고 있으며, v8값으로 저장주소의 인덱스 참조를 조정할 수 있다.

     

    [그림 6] win( ) 실행 조건

    그리고 win( ) 실행 조건은 *(v5+7)위치에 0xB0000000B5가 저장되어 있어야 한다.

    여기서 포인트는 주소참조를 +7로 하고 있다는 점이다.

     

    64Bit 운영체제의 Address Alignment(주소 조정)은 8Byte Boundary로 이루어진다. (32Bit에서는 4Byte)

    따라서, v5[ ]와 같이 Index로 주소를 참조할 때 0x7FFF0008, 0x7FFF0010... 와 같이 8Byte간격으로만 참조된다.

     

    이 때문에 문제 이름 misalignment처럼 아무리 0xB0000000B5를 저장해도 비교문에서는 항상 1Byte가 어긋나게 된다.

    이 부분을 어떻게 해결해서 저 비교문을 참값으로 만드냐가 이번 문제의 핵심이다.

     


    Solve

    방법은 간단하다.

    우리가 입력한 값이 초기화되지 않기 때문에 두번 나눠서 입력해주면 된다.

     

    [그림 7] *(v5+7) 개념도

    그림으로 표현하면 이런 느낌이다.

     

    [그림 8] 메모리 뷰

    실제 메모리에 저장된 모습은 위 모습과 같다.

     

    [그림 9] win( ) 실행

    *(v5+7)의 저장된 값(RDX)과 0xB0000000B5(RAX)가 같기 때문에 if문 내부의 win( ) 호출코드로 이동한 모습이다.

     

    [그림 10] Solve

    'System > Pwnable.xyz' 카테고리의 다른 글

    JMP Table Write-up  (0) 2020.01.20
    two targets Write-up  (1) 2020.01.20
    note Write-up  (0) 2020.01.19
    xor Write-Up  (1) 2019.12.22
    Welcome Write-Up  (0) 2019.12.08

    댓글

Designed by Tistory.