ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Pwnable.kr input 풀이
    Wargame/Pwnable.kr 2019. 8. 5. 13:31

    2야 오랜만에 올리는 포너블케알 풀이입니다

    이번 코드는 좀 길어서 5부분? 으로 나눠서 설명해야겠습니다 긴거 딱 싫은데ㅎ

    스테이지로 나뉘어있는데, 스테이지1은 main 함수에 전달되는 인자의 개수가 100개, argv['A']와 argv['B']가 각각 \x00, \x20\x0a\x0d여야 통과할 수 있습니다.

    스테이지2는 표준 입출력에 관한 문제네요 우리가 pwnable.kr의 첫번째 문제인 fd에서 배웠던 내용을 되살리면 힌트를 얻을 수 있는데, read 함수의 첫번째 인자가 fd와 관련이 있습니다.

    거기서 0이 입력, 1이 출력, 2가 에러였을 텐데, 그대로 처음엔 stdin으로 \x00\x0a\x00\xff를, 두번째엔 stderr로 \x00\x0a\x02\xff를 넘겨주면 해결할 수 있습니다

    근데 memcmp의 세번째 인자는 무슨 내용인지 궁금해서 찾아봤습니다

    는 크기네요 입력받는 값 4바이트 맞죠 넘어갑시다

    스테이지3은 환경변수 관련 내용 같은데, getenv가 \xde\xad\xbe\xef에 붙어있는 걸로 봐서는 \xde\xad\xbe\xef라는 환경변수와 \xca\xfe\xba\xbe를 비교하는 거 같습니다.

    그럼 뭐 다시쓰기 귀찮으니 카페를 데드에 넣으면 될 거 같네요

    스테이지4입니다 이번엔 파일 관련한 내용이군묘

    \x0a라는 파일을 (읽기) 모드로 열고 읽어온 첫 4바이트가 \x00\x00\x00\x00면 되는 간단한 문제 같습니다.

    이제 뭔가 보스가 남았을 거 같군요 ㅎ

    ㅎ ?

    ㅎㅎ 소켓 모르는데ㅎ

    ㅎㅎㅎㅎ 소켓도 공부해야겠다 ㅎㅎㅎㅎ

    어쨌든 간단히 설명해보자면 argv['C']의 정수형으로 반환된 값을 포트번호로 해서, 소켓 서버를 열고 그 서버로 \xde\xad\xbe\xef를 보내면 클리어하는 문제라고 합니다.

    어우.. 웹 크롤러만 공부할 게 아니라 소켓쪽도 함 건드려봐야겠네요..

    일단 tmp 디렉에서도 권한이 없으므로 그 아래 디렉토리를 하나 더 만들고 거기에 익스플로잇을 짜야 합니다 ㄱㄱ

    문제를 알았으니 익스플로잇도 뭔 내용인지는 알아야겠죠 그럼 설명을..ㅎ..하..

    #!/usr/bin/python
    
    from pwn import *
    
    #stage1
    argvs = [str(i) for i in range(100)]
    argvs[ord('A')] = '\x00'
    argvs[ord('B')] = '\x20\x0a\x0d'
    # 인자를 100개 넘겨준 뒤, A의 아스키코드 위치에는 \x00을, B의 아스키코드 위치에는 
    # \x20\0a\x0d를 넘겨준다.
    
    #stage2
    with open('./stderr', 'a') as f:
    	f.write('\x00\x0a\x02\xff')
    # stderr에서 \x00\x0a\x02\xff를 넘겨준다. stdin은 좀 이따 다룰 것
    
    #stage3
    envVal = {'\xde\xad\xbe\xef':\xca\xfe\xba\xbe'}
    # 말할 필요가 있나
    
    #stage4
    with open('./\x0a', 'a') as f:
    	f.write('\x00\x00\x00\x00')
    # 0a 파일을 열어서 \x00\x00\x00\x00을 넘겨준다.
    
    #stage5
    argvs[ord('C')] = '40000'
    # 여긴 사실 모르겠음
    
    target = process(executable='/home/input2/input', argv=argvs, stderr=open('./stderr'), env=envVal)
    # 인자를 전달하고, stderr 파일을 열고, 환경변수를 설정하는 등 기타 초기설정을 해준다.
    
    target.sendline('\x00\x0a\x00\xff')
    # stage2의 stdin을 여기서 하는거임
    
    conn = remote('localhost', 40000)
    conn.send('\xde\xad\xbe\xef')
    target.interactive()
    # 본 서버 포트 40000에 \xde\xad\xbe\xef를 보내고 전체 익스를 실행시킨다.
    # 설명이 거지같다. 솔직히 서버 관련해서는 아직 안 다뤄봐서..

    그래서 실행시키면 잘 실행은 되는데 플래그가 안 뜨죠 지금 위치에선 플래그 파일이 없기 때문입니다ㅏ아

    고로 심볼릭 링크 걸어서 연결시키면 플래그가 뜨겠죠?

    걸어서

    실행시키면 플래그가 잘 뜨는 것을 확인할 수 있습니다 !

    근데 재밌는건 여기서 포트번호를 30000으로 하면 프로세스가 끝난 뒤에 플래그가 뜬다는 건데, 이건 아마도 소켓을 배워야 이해할 거 같네요

    그럼 저는 소켓도 하러 가보겠습니다 ㅂㅂ

     

    간만에 풀이 겁나 길게 썼네요 하하

     

    맞다 익스, 풀이는 대부분 

    https://mandu-mandu.tistory.com/76

     

    pwnable.kr [input] 풀이

    input - 4 pt Mom? how can I pass my input to a computer program? ssh input2@pwnable.kr -p2222 (pw:guest) ssh 접속을 하고 소스를 확인합니다. input2@ubuntu:~$ ls -l total 24 -r--r----- 1 input2_pwn ro..

    mandu-mandu.tistory.com

    이 분 블로그 참고해서 써봤습니다 ㅎㅎ 사실 익스는 그냥 베낀거라 해석만 한 거라 봐도 무방.. 만두님께 감사를 표합니다 ^~^

     

    2019.8.5

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

    Pwnable.kr mistake 풀이  (0) 2019.08.11
    Pwnable.kr leg 풀이  (0) 2019.08.07
    Pwnable.kr random 풀이  (0) 2019.07.22
    Pwnable.kr passcode 풀이  (0) 2019.07.22
    Pwnable.kr flag 풀이  (0) 2019.07.22
Designed by Tistory.