본문 바로가기
HACKING_GAME/SYSTEM

LOB#2 small buffer (gremlin -> cobolt)

by asdf12345 2020. 4. 26.

1. 개념

1) Case

다수 이용자(Robot, Eric, Otis) 접속 가능 서버 존재, 각 이용자에 따른 권한(파일 확인, 수정, 실행) 다름.

서버 내 파일 중, 실행 시 파일 소유자, 소유 그룹의 권한 획득 가능 파일 존재

(불법사이트 서버 관리자인 Eric의 파일을 참고해야하는 DB관리자 Robot, 하지만 Robot 따위에게 서버 최고 권한을 줄 수 없음, Eric은 Robot이 파일을 참고할 수 있도록, 프로그램(Eric이 소유한 파일) 실행 시, Eric 파일을 볼 수 있는 Binary file을 만들어줌)

 

 

2) Vulnerability

프로그램 실행 시, input 내 SHELL 실행 코드 삽입 및 실행 가능하다면?

-> 서버 내 타 이용자의 권한 획득 가능 -> 접근 권한이 없는 파일 확인, 수정, 실행 가능

(Robot이 Eric에게 받은 파일을 실행해봄, 파일 이름을 치면, Eric만 볼 수있는 파일을 확인 할 수 있었음, 디컴파일 도구를 통해 코드 확인이 가능한 Robot, Robot은 취약한 함수를 통해 서버를 털어버리고자 결심함)

아이콘-설정 png from pngtree.com

 

 

3) Structure of a process

1. Stack은 큰 주소에서 작은 주소로 자란다.

2. Stack 내 함수마다 하나의 저장장소(=frame)가 만들어진다.

3. frame 내 arguments, return address, SFP(=stack frame pointer) 가 저장된다.

 

한 함수 안에서 쓸 값들은 자기 frame에 넣어서 편하게 이용

return address 지정을 통해 코드 흐름 유지 (MAIN() line 4 ->A()->? MAIN() line 5(=return address))

 

2. 문제 풀이

1) CODE

2) Assembly

3) Solution

1.shell code 삽입 공간 + return address 변조 필요

 

main()의 frame은 작음 -> 다른 함수 frame 이용가능?

확인 : stack은 from 큰 주소 to 작은 주소로 쌓임, 변수 값은 from 작은 주소 to 큰 주소로 쌓임 -> main()함수 이전 실행 함수 존재 확인 필요 (-> CALL 명령어 실행 시, return address 저장 -> return address 확인 하여 이전 실행 함수 확인)

__libc_start_main()의 frame 이용 가능 확인 완료

 

 

 

[1] Return address 확인

main() 호출 전, libc_main_start() 함수 실행하므로 libc_main_start() 코드 복귀를 위한 return address 저장 확인

 

stack 모양(+주소 크고 작고만 check하기 위해  주소로 임의 표기함 )

[2] shell code 삽입 공간 확인

-> 함수 frame 확인 시, main() 호출 전 libc_start_main() 실행 하므로 해당 프레임 또한 이용 가능

+BUT, shell code 삽입 시, shell code 내 push 함수 등이 존재하므로 nop코드 삽입 후, 넣어줘야 정상 실행됨

[3] return address 변경 및 shell code 삽입 실시

shell code는 구글링하여 짧고 /x00바이트 미포함된 코드 이용함

 

 

 

'HACKING_GAME > SYSTEM' 카테고리의 다른 글

LOB#1 gate  (0) 2020.07.19
PWNABLE#7 input  (0) 2020.05.14
LOB#6 check length of argv[1] + egghunter + bufferhunter (wolfman -> darkelf)  (0) 2020.05.10
LOB#4 egghunter (goblin -> orc)  (0) 2020.04.26
PWNABLE#3 bof  (0) 2020.04.26