ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TJCTF 2019] Slice of PIE write up
    CTF Write-Up 2019. 4. 18. 11:36

    PIE에 관한 문제입니다.


    PIE란?

    Position Independent Executable의 줄임말로, 전체가 위치 독립 코드로 이뤄진 실행 가능한 바이너리입니다.

    PIE는 위치 독립 실행파일이고, 실행할 때마다 매핑되는 주소가 어디든지에 상관없이 시행되는 파일로, 바이너리의 주소를 랜덤화 하여 바이너리의 특정 주소의 값을 수정하는 것과 같은 공격을 방어합니다.

     

    Ref :  https://bpsecblog.wordpress.com/2016/06/10/memory_protect_linux_4/

     

    풀이를 위해 어떤 파일인지 알아봅시다.

    file, checksec

    해당 바이너리는 NX, PIE, Full RELRO가 걸려있습니다.

    또 stripped되어있어서 심볼이 삭제되어 있습니다.

     

    다음으로 디컴파일을 해보겠습니다.

    main()

    main()에서 user input을 len이라는 변수에 scanf()를 이용해서 받고 있는데,

    len의 값이 7과 &연산을 통해 1이상의 값이 되면 조건문을 만족하여 "Bad length"를 출력하고 프로그램이 종료됩니다.

     

    그리고 8의 배수를 입력하면 7과 &연산을 통해서 0이 되고, 조건문을 만족하지 않고 분기하여 sub_9B3이라는 함수가 호출됩니다.

     

    sub_9B3()

    이 부분에서 user input을 인자로 받아 그 만큼 입력을 받습니다.

    따라서 ret를 덮어쓸 수 있는데 딱 적합한 함수가 코드영역에 존재합니다.

     

    win()

    해당 함수의 이름은 제가 rename을 한것이구요.

    간단하게 system("/bin/sh")을 호출해줍니다.

     

    따라서 문제의 의도대로 이 부분으로 ret를 조작하려면 이 함수의 주소를 알아야하고, 버퍼의 크기를 알아야합니다.

     

    이 부분은 디버깅을 통해 알아봅시다.

    strip되어있어서 그런지 함수의 주소를 알아내기가 여간 힘들었는데

     

    PIE의 치명적인 단점이 하나 존재해서 쉽게 구할 수 있었습니다.

    func list

    PIE가 걸린 바이너리는 주소값이 이렇게 매핑되는데 이 1.5byte의 값이 일정하게 유지된다는 점입니다.

    따라서 정리를 해보자면

     

    code영역의 base주소를 찾는다면 해당 offset을 더해주면 그 함수의 시작 주소가 될것입니다.

     

    예를 들어서 main()는 A34로 찾으면 됩니다.

     

    func mapping address

    따라서 gdb를 이용해 다음과 같이 main() 및 다른 함수의 시작 주소를 알 수 있습니다.

     

    이제 bp를 걸고 디버깅을 할 수 있을겁니다.

    먼저 8의 배수인 40을 입력하고, A문자 40개를 입력한뒤

    마지막 ret전에 멈춰봤습니다.

     

    입력값의 주소와 ret시 들어갈 rsp의 주소의 offset을 구해보면 24가 나오네요.

    이제 ret를 어떤 주소로 덮어쓸것인가를 생각하면 될것같습니다.

     

    이전에 알아본 쉘함수의 주소는 0x5555555549a0입니다.

    근데 스택에 ret 다음 다음에 위치해 있는것을 확인할 수 있습니다.

     

    그렇다면 ret가젯을 이용하면 되는데

    해당 가젯은 vsyscall영역에서 찾을 수 있습니다.

     

    vsyscall 영역은 ASLR, PIE가 적용된 환경 및 바이너리에서도 동일한 주소값을 갖고,

     

    vsyscall

    이렇게 실행권한, ret가젯이 있기 때문에 이 문제에 적합한 가젯입니다.

     

    따라서 이 가젯을 이용하여 익스하면 됩니다.

     

    flag

     

    반응형

    'CTF Write-Up' 카테고리의 다른 글

    CBM CTF 2019 write up  (0) 2019.04.10
    RITSEC CTF 2018 ezpwn write up  (0) 2018.11.19
    DEFCON CTF Qualifier 2018 ghettohacker:Throwback write up  (0) 2018.05.15
    Pico CTF 2013 ROP3 write-up  (0) 2018.03.10
    Pico CTF 2013 ROP2 write-up  (0) 2018.03.10
Designed by Tistory.