cobolt로 로그인하면 goblin 문제를 볼 수 있다. goblin 문제를 실행해본다면 입력을 받은 뒤, 입력을 받은 값을 똑같이 출력해준다.
소스코드를 확인해보면 bof에 취약한 대표적인 함수인 gets 함수로 입력을 받는다. 이 gets 함수는 입력 값의 길이에 제한을 두지 않기 때문에, 입력 값이 저장되는 buffer 변수의 크기인 16byte 이상 입력을 한다면 overflow가 발생한다.
딱봐도 쉘 코드를 buffer에 삽입하기에는 공간이 부족하기 때문에 환경변수를 이용해야 될 것 같다고 생각했다. 일단 buffer가 16byte 크기고 다른 변수들은 존재하지 않기 때문에 굳이 gdb로 열어볼 필요 없이 blind 상태로도 exploit이 가능할 것 같았다.
buffer의 크기가 16byte이므로 sfp(스택 프레임 포인터 / 4byte)를 더한 20byte의 더미 값 + 삽입한 환경변수의 주소를 입력 값으로 준다면 될 것 같다.
(물론 코드나 컴파일러 버전에 따라 변수들의 스택 위치가 달라지므로, 이건 100% 성공할 수 있는 방법이 아니다. 그저 예측이다.)
이전 문제와 똑같이 환경변수에 \x90과 쉘 코드를 삽입한 후 환경변수 주소를 구하는 c언어 코드를 작성한 뒤 빌드해, 주소를 구했다.
(python -c "print '\x90'*20+'\x60\xfc\xff\xbf'"; cat) | ./goblin
20byte의 dummy + (쉘 코드가 존재하는 환경변수의 주소)를 입력 값으로 주니 쉘을 얻었다. 다음 단계의 pw는 "hackers proof"다.
'Wargame > LOB' 카테고리의 다른 글
[LOB] gremlin -> cobolt (0) | 2021.06.27 |
---|---|
[LOB] gate -> gremlin (0) | 2021.06.26 |
[LOB] Lord Of BOF bash 문제 (0) | 2021.06.26 |