IMyoungho 2019. 4. 17. 16:57

이번 문제는 Input2이다.

문제는 생각보다 어렵지 않았으나

Payload짜는데서 조금 헤맸다..ㅎㅎ



코드를 보도록 하자

이 문제의 FLAG를 얻기 위해서는 5개의 Stage를 통과해야한다.




먼저 첫 번째 Stage를 보자.

우선 argc가 100이 되어야하고 넘겨지는 argv의 'A'와 'B' 번째 값이

각각 "\x00" 과 "\x20\x0a\x0d"의 값이 들어가야한다.



굉장히 간단하게 넘길 수 있다. 나는 Python을 사용했고 argv는 list형태로 넘겨야한다.

이런식으로 구성하였다.'A'와 'B'는 각각 65, 66을 의미하므로

65번째와 66번째에 값에 요구하는 값을 넣어주었다.




다음 Stage를 보도록 하자. Stage2번이다.

buf에 read를 두 번 진행하게되는데 fd를 보면 첫 번째는 0이고

두 번째 read 함수에서는 2이다. 0은 stdin을 뜻하고 2는 stderr를 의미한다.

그러므로 read의 fd인자가 0일때는 그냥 입력으로 "\x00\x0a\x00\xff"를

입력해서 if문을 우회하면 될 것이고 다음의 fd가 2인 read의 경우

file open을 통해 stderr에 "\x00\x0a\x02\xff"를 해주면 될 것이다.

stdin으로 입력을 해주고~

stderr도 입력해주면~ 간단하게 해결할 수 있다.






다음 Stage3은 환경변수에 관련된 문제이다. 이러한 환경변수의 값을

넘겨 줄 수 있는데 넘겨줄 때 dictionary 형태로 넘겨야 한다.

그러므로 다음과 같이 진행해주었다.






다음으로는 또 file open에 관련된 문제인데



./0a에서 4바이트를 읽어 buf에 저장한다. 이 때 buf 저장된 값이

"\x00\x00\x00\x00"이어야 하므로 우리는 write를 이용하면 된다.



마지막으로 Stage5이다.

sin_port를 argv['C'] 즉 argv 67번째의 값과 맞도록 진행해줘야하며

"\xde\xad\xbe\xef"를 전송해주면 해당 값을 recv하게 되면서 FLAG가 출력된다!!

이런식으로 argv[67]값을 수정해주고



sin.port를 맞춰서 진행한 뒤 "\xde\xad\xbe\xef"를 전송해준다.



그러므로 최종 Payload는 다음과 같게 된다.

참고로 우리는 권한이 없어서 해당 Payload를 작성할 수 없기 때문에

tmp 디렉토리로 가서 작성하였다.




해당 payload를 진행하게되면 FLAG를 볼 수 있게 된다? 는 아니고

flag가 없기 때문에 원하는 결과를 볼 수가 없다. 




그러므로 심볼링 링크를 걸어서 flag파일을 생성해주자



짜잔~ 원하는 FLAG를 볼 수 있게 된다.


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

반응형