본문 바로가기

시스템/pwnable.kr

input

 실행



입력 잘하면 flag 준단다.


소스 코드 확인

        

    

main


크게

1. argv     

2. stdio    

3. env      

4. file       

  5. network

     로 나눌 수 있다.


argv


조건

1. argc가 100                      

 2. argv['A']가 "\x00"             

     3. argv['B']가 "\x20\x0a\x0d"



ord() : 문자의 아스키코드값 반환하는 함수

   

이렇게 코드를 작성하고 process함수의 argv인자에 ch를 설정해주면 된다.    

                     

stdio


조건

1. 표준입력으로 4byte 읽은 문자열이 "\x00\x0a\x00\xff"

2. 표준에러로 4byte 읽은 문자열이 "\x00\x0a\x02\xff"   



표준 에러 : one.txt파일을 a(all)모드로 open, "\x00\x0a\x00\xff"을 write한 후 바로 close하고 

process함수의 stderr를 one.txt의 파일 기술자로 설정

표준 입력 : p.sendline함수(표준 입력)로 "\x00\x0a\x00\xff" 전달                                     


env


조건

"\xde\xad\xbe\xef"의 환경변수 값이 "\xca\xfe\xba\xbe"


이건 process함수의 env를 이용


file


조건

1. "\x0a"파일을 r모드로 연다.            

    2. 그 파일을 4byte읽어서 buf에 넣는다.

  3. buf값이 "\x00\x00\x00\x00"       


with as 구문을 써서 간단히 "\x0a"파일에 "\x00\x00\x00\x00"을 쓴다.


network


조건

1. socket을 생성한다.

2. bind, linsten한다.(port는 argv['C'])

3. 클라이언트와 accept한 후, recv한 4byte 데이터가 "\xde\xad\xbe\xef"


일단 process함수 자체가 원격 호스트의 로컬에서 실행되는 것

즉, 로컬 호스트에서 tcp나 udp 연결을 만든 후 그 소켓에 "\xde\xad\xbe\xef"를 전송


argv['C']를 아무 값(ex. 5555)으로 설정한 후, 

remote 함수를 이용해 로컬 호스트에 5555번 포트로 연결하는 통신 생성,

반환된 오브젝트에 send()로 "\xde\xad\xbe\xef" 전달



* 프로세스 생성 후에 remote함수 이용

remote('연결할 호스트','포트번호')


최종 코드




참고

1. 리눅스에선 모든 입출력과 관련된 장치는 파일과 동일하게 보고 처리한다.

윈도우에서 하드디스크의 경우 C:, D:와 같이 다루어지는 것과 달리,     

리눅스는 장치파일이라는 특수한 파일 형태로 다룬다.                          

프린트, 사운드카드 까지도 파일의 형태로 다른다.                                


2. sendline으로 프로세스에 데이터를 보내면 표준 입력으로 보내진다.        

 표준입력은 프로세스가 생성될 때 자동으로 열린다.                               


               3. (python) with as 구문 : 파일을 열고, 사용 후에 닫는 것을 보장토록 하는 코드로 매우 간단


4. ./test aaa  = ./test “aaa”   = ./test `perl -e ‘print “aaa”’`                               

                                                                    = ./test `python -c ‘print “aaa”’` = ./test `echo “aaa”`                                                      


5. main의 envp로 시스템 환경 변수에 대한 정보를 받아올 수 있다.                           

                     프로세스가 실행되면 시스템으로부터 환경변수 정보를 받아서 이 정보를 바탕으로 실행이 된다.

                       setenv, putenv 같은 함수들로 조작을 하더라도 해당 프로세스의 환경변수가 변경되는 것일 뿐 

실제 시스템의 환경변수가 변화되는 것은 아니다.                                                 


6. 무슨 문자열이던지 '\x0'을 끝에 붙여줘서 문자열의 끝을 인식하게 해주자.              


'시스템 > pwnable.kr' 카테고리의 다른 글

mistake  (0) 2018.11.05
leg  (0) 2018.11.05
random  (0) 2018.11.04
flag  (0) 2018.11.04
bof  (0) 2018.11.04