-
[Pwnkr] Input2 Write-up표튜터와 함께하는 Pwnable/Pwnable.kr Write-up 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를 볼 수 있게 된다.
반응형'표튜터와 함께하는 Pwnable > Pwnable.kr Write-up' 카테고리의 다른 글
[Pwnkr] Unexploitable Write-up (2) 2019.05.17 [Pwnkr] Blukat Write-up (0) 2019.04.15 [Pwnkr] Black Jack Write-up (0) 2019.04.15 [Pwnkr] Cmd1 Write-up (0) 2019.04.04 [Pwnkr] Lotto Write-up (0) 2019.04.03 댓글