본문 바로가기
Wargame/pwnable.kr

pwnable.kr input

by morae23 2019. 2. 1.

[Toddler's Bottle] input


먼저 input 코드는 아래와 같다.




5개의 스테이지로 이루어져있다.



STAGE 1.

stage1은 argv이다.


argc가 100이고, argv['A'], argv['B']의 값이 특정 값이어야 클리어할 수 있다.

따라서 pwntools를 이용하여 argv를 맞춰주면 된다.


이 때, argv[0]에는 실행파일의 경로가 들어간다.

pwntools를 이용하여 argv를 넘겼을 때, argv[0]에 실행파일 경로가 추가되는지를 확인하기 위한 과정을 거쳤다.


아래와 같은 코드를 작성한 뒤 컴파일하였다.





그 뒤, first, second를 입력한 것이 첫 번째 실행 결과이다.

argv[0]에는 경로가 들어가고 argv[1]에 first가 들어간 것을 볼 수 있다. argc도 3이 된다.


두 번째 실행 결과는 pwntools를 이용하여 argv에 first와 second를 넘겨준 결과이다.

argv[0]과 argv[1]에 넘겨준 값들이 바로 들어 있는 것을 볼 수 있다. argc는 2이다.

즉, argv[0]에 실행파일 경로가 들어가지 않고, 입력해준 대로 들어간다는 것을 알 수 있다.




test.py 코드는 아래와 같다.




STAGE 2.

stage 2는 stdio이다.

코드를 보면 read()를 두 번 하는 것을 볼 수 있는데, 첫 번째는 stdin, 두 번째는 stderr이다.

stdin의 경우, stdin_data에 값을 담아 send()를 이용하여 전달하였다.

stderr의 경우, err라는 파일에 값을 넣은 뒤 stderr를 파일을 통해 읽도록 하였다. (12-13, 19라인)


STAGE 3.

stage 3은 env이다.

process()에서 env를 넣어 주었다.


STAGE 4.

stage 4는 file 이다.

파일은 연 뒤, 값을 넣어 주었다.


STAGE 5.

stage 5는 network이다.

포트가 argv['C']이므로 argv[67]을 5555로 넣어준 뒤 remote()를 이용하여 0xdeadbeef를 전달했다.


STAGE1 ~ STAGE5 를 포함한 익스 코드는 아래와 같다.




/tmp/morae23이라는 디렉토리를 만들고, flag파일에 링크를 걸어 주었다.



그 결과 플래그를 얻을 수 있다.





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

pwnable.kr blackjack  (0) 2019.02.01
pwnable.kr coin  (0) 2019.02.01
pwnable.kr cmd2  (0) 2019.02.01
pwnable.kr cmd1  (0) 2019.02.01
pwnable.kr asm  (0) 2019.02.01

댓글