ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ Rookiss ] otp
    System/Pwnable.kr 2019. 3. 6. 05:33

    OTP시스템을 만들었는데, 자기가 실수한게 있는지 확인 좀 해달라는 문제다.


    ssh로 접속하는걸 보니, 로컬에서 뭔가를 해야하는 'Local Exploit'문제의 가능성을 열어두고 풀도록 하자

    그리고 레이스컨디션이나 브루트포스로 푸는 문제는 아니라고 한다.


    [ Binary Code ]

    이것저것 여러가지 하는데 urandom에서 읽어온 값을 맞추면 쉘이 떨어지는 코드다.

    여기서 눈 여겨봐야할 것은 '반환값 검사'의 유무다.

    겉으로 보기에는 철저하게 검사를 하고 있는 것 같지만, fwrite( )의 반환값은 검사하지 않는다.

    fwrite( )의 반환값은 정상적으로 실행됐을 경우 '출력한Byte' / 실패한 경우 -1을 반환한다.


    해당 프로그램에서는 User_input값과 비교할 랜덤값을 임시파일에 써놓는 역할을 하고 있는데,

    이 값이 제대로 저장이 됐는지를 확인하지 않는 상황이다.


    자 이 Point를 잡고 어떻게 문제를 풀 수 있을까?

    먼저 ulimit명령어에 대해서 알고 가야한다.


    문제를 풀다가 core파일이 생성되지 않을 때, 자주 사용해봤을 것이다.

    그때는 'ulimit -c unlimited' 라는 명령어를 입력했었는데, 이 의미에 대해서 제대로 알아본 사람은 드물 것이다.

    나 또한 그랬으니..


    [ ulimit이란? ]

    ulimit은 프로세스의 자원한도를 설정하기 위한 명령어이다.

    위 옵션을 보면 우리가 그동안 사용한 명령어의 의미를 알 수 있다.

    'ulimit -c unlimited' == '코어파일의 사이즈를 무제한으로 설정한다'


    해당 문제에서는 -f 옵션을 사용하면 되는데,

    -f옵션은 Shell이 만들 수 있는 파일의 최대크기에 대한 자원을 설정해줄 수 있다.


    위에서 fwrite( )로 8byte만큼의 값을 파일에 쓰려고 할 때, 한도가 0으로 설정되어 있다면?

    해당 파일에는 아무런 값도 저장되지 않을 것이기 때문에, OTP시스템에 취약점이 발생하게 된다.


    [ otp@ulimit -a ]

    다시 문제로 돌아와서 ulimit -a으로 시스템의 자원설정값들을 확인해보면,

    File Size의 최대값이 120000으로 설정되어 있는 것을 확인할 수 있다.


    [ ulimit -f 0 ]

    -f 옵션을 사용해서 File Size의 최대값을 0으로 설정해준 뒤,

    다시 확인해보면 0으로 설정된 것을 볼 수 있다.


    [ File write Error ]

    ulimit으로 File Size 최대값을 0으로 설정했기 때문에, vi으로 값을 쓰려고 하면

    File size limit exceeded라는 오류메세지를 출력하면서 편집기가 종료된다.


    [ Congratz! ]

    pwn모듈이 없어서 os모듈을 사용해서 argv에 Null값을 넘겼다.


    여담으로 간만에 정말 대단한 문제를 만난 것 같다.

    이런식의 문제를 만들수 있다는 것도 대단하고, ulimit으로 취약점을 트리거하는 점도 신선했다.


    정말 여러가지 방법으로 시도해봤는데, 내가 생각했던 방법은 모두 'Race Condition'이였다.

    힌트로 Race Condition은 아니라고 명시되어 있음에도 불구하고, 머리가 그쪽밖에 생각을 못했다.

    문제를 풀면서 문제풀이에 대한 사고방식을 키울 수 있어서 정말 좋았다.


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

    [ Rookiss ] Ascii_easy  (2) 2019.04.05
    [ Rookiss ] Alloca  (1) 2019.03.24
    [ Toddler's Bottle ] asm  (4) 2019.03.09
    [ Rookiss ] Simple Login  (2) 2019.01.17
    [ Rookiss ] loveletter  (0) 2018.08.26

    댓글

Designed by Tistory.