gate 문제를 풀 때 wsl telnet을 이용해 접속했다가 쉘이 얻어지지 않는 문제가 생겨, 이번에는 putty로 접속했다.
문제 파일 cobolt와 소스코드 cobolt.c가 주어져 있다.
문제 파일을 실행해보니 인자를 받는 것을 알 수 있었다. 많은 '1'을 인자로 주니 Segmentation fault가 터진 것을 보아 bof 취약점이 있을 가능성이 높다.
소스코드를 확인해보면 인자 값을 strcpy 함수로 16byte 크기의 buffer에 복사해주는데, gate 때와 마찬가지로 길이를 검증하는 로직이나 함수를 사용하지 않는다. 따라서 인자 값으로 16byte보다 긴 값을 준다면 overflow가 발생한다.
gate와 마찬가지로 buf에 쉘 코드를 삽입한 뒤 ret를 buf의 주소로 조작해 쉘을 얻을 생각으로 문제 파일을 복사 후 gdb로 열어보았다.
ret의 주소는 함수 프롤로그 부분에서 얻을 수 있으므로, 프롤로그에 bp를 걸고 buf의 주소를 얻기 위해 strcpy 함수가 호출되는 부분에도 bp를 걸었다.
ret는 0xbffffb0c, buf는 0xbffffaf8이고 거리는 20byte인 것을 알 수 있다.
문제가 생겼다. 지난 포스팅에서 직접 만든 쉘 코드의 길이는 25byte기 때문에 쉘 코드가 들어갈 공간이 없다. 이렇게 된다면 환경변수에 쉘 코드를 삽입하고 환경변수의 주소를 구해, 그 값으로 ret를 변조해야 될 것 같다.
환경변수 gremlin에 쉘 코드의 신뢰도 향상을 위한 \x90과 함께 쉘 코드를 넣어주었다. 그리고 getenv 함수를 이용한 간단한 c언어 코드를 작성한 뒤 빌드해, 환경변수 gremlin의 주소를 구했다.
./cobolt `python -c "print '\x90'*20 + '\x17\xff\xff\xbf'"`
공격에 필요한 정보들은 모두 얻었으므로 '\x90'으로 20byte를 채운 뒤 ret를 환경변수로 변조하는 파이썬 코드를 짜서 공격을 시도하니, 성공적으로 쉘을 얻을 수 있었다.
다음 레벨의 pw는 hacking exposed다.
'Wargame > LOB' 카테고리의 다른 글
[LOB] cobolt -> goblin (0) | 2021.06.27 |
---|---|
[LOB] gate -> gremlin (0) | 2021.06.26 |
[LOB] Lord Of BOF bash 문제 (0) | 2021.06.26 |