감자 텃밭

Gate 문제 본문

my_study/LOB

Gate 문제

g2h 2021. 5. 17. 11:31

처음 gate로 로그인하여 ls -l을 통해 해당 경로에 존재하는 디렉터리 및 파일을 확인

해당 gremlin과 gremlin.c 파일이 존재하여 .c파일을 확인하여 소스코드를 확인

해당 소스코드의 내용은 1개 이상의 인자를 받아야하며, 그렇지 않을 경우 "argv error"을 출력하고

프로그램이 종료되고, 1개이상의 받았을 경우 해당 인자를 buffer변수로 옮긴 후 해당 문자열을 출력하는 코드라는 것을

알 수 있었다.

- 해당 코드의 취약점?이라고 하면 strcpy함수이다 이 함수는 입력값 검증 없이 해당 인자 값을 버퍼에 옮기기 때문이다.

 

코드 분석을 위해 gdb를 실행하려 하였지만 권한 문제가 발생하여 임시파일을 생성할 수 있는 디렉터리인

tmp파일에 복사하였음

그 후 gdb를 통해 분석을 시도!!!

esp0x100 (10진수로 변환했을 때 256)256) 크기만큼 늘린 후 인자 값을 1개 이상 받았는지 확인 후 에러 출력 등의 기능을 수행하는 어셈블리어 코드들이 보인다. 여기서 중요한 건 버퍼라고 생각했다. 해당 문제는 버퍼오버플로우를 일으켜 버퍼에 쉘 코드를 삽입하여 ret가 돌아갈 주소에 버퍼의 주소를 집어넣게 되어ret가 버퍼의 시작 주소로 찾아가 쉘 코드를 수행하여 쉘을 획득할 수 있다. 해당 코드를 봤을 때 스택에는 bup(256)-sfp(4)-ret(6) bup(256)-sfp(4)-ret(6)으로 되어 있다.

이를 통해 buf+sfp 총 260 크기만큼을 더미 값+쉘 코드를 삽입하고 ret에 버퍼의 주소를 삽입하여 공격하는 방식으로 추측

 

A를 대량으로 넣어 버퍼의 주소를 알아내기 위함 (41은 아스키 코드로 A)

A를 집어넣어 해당 버퍼의 주소를 확인하였을 때 버퍼의 시작 주소는 0xbffff9280 xbffff928이라는 것을 알 수 있었다.

 

그리하여 이제 python을 이용하여 payload를 작성하여 인자 값으로 보내었다.

앞의 버퍼와 sfp의 주소를 채우기 위해nop(\x90)을 앞에 100개를 배치하고 그 뒤에 25byte의 쉘 코드를 삽입 나머지 136바이트 만큼 nop(\x90)을 삽입하여 buf+sfp를 덮은 후 ret가 돌아갈 주소에 버퍼의 시작 위치인 0xbffff9280 xbffff928를 넣어 공격한 결과!!!!!!!!!!!!!

성공적으로 공격에 성공하고 쉘을 획득하여 해당 문제의 FLAG를 획득할 수 있었다.

FLAG=hello bof world

 

'my_study > LOB' 카테고리의 다른 글

wolfman  (0) 2021.05.20
orc  (0) 2021.05.19
goblin  (0) 2021.05.18
cobolt  (0) 2021.05.18
Gremlin 문제  (1) 2021.05.17