System Hacking/Study Notes

Extra Segment & Exit (with. FSB)

S!_Jmini 2020. 1. 13. 19:24

# 들어가기전에

 

2020-01-13 에 배운 내용입니다

 

포맷스트링 버그(FSB)와 exit 함수의 호출 루틴을 이용하여 exploit 하는 방법을 알아보도록 하자

 

제목의 Extra Segment 는 확장영역을 의미하며  프로그래머에 의해 사용처가 정해진다

 

또 그외에 fs와 gs 도 존재하는데 다른 영역들과 달리 사용처가 특별히 정해지지 않는 영역이다

 

 

IDA를 통한 분석을 하다보면 fs와 gs를 자주 보게되는데

 

이들은 Canary 값들과 연관이 있다

 

 

 

 

 

* CS 는 Code segment, DS 는 Data Segment 등 의미가 있는데 f와 g는 무엇을 의미할까?

-> Extra Segment 에서 알파벳 순서로 e 다음은 f 와 g 라서 이름이 그런것이다

 

 

 

 

 

 

# 알아보기

 

 

 

위에서 보았듯이 Canary 값들(64bit 기준)은 fs에서 0x28만큼 떨어진 곳에 들어있는 값을 Canary 로 정한다

 

그런데 fs가 어디있는지 알고 값을 참조하는 것일까?

 

 

먼저 Canary 보호기법이 걸려있는 파일을 디버깅해보자

 

 

 

 

gets에 값을 넣기 전 stack 상황을 한번 살펴보면

 

 

 

rsp 기준 stack 상황

 

 

첫번째 네모박스에는 Canary 값이 stack 에 들어있는 모습이고

 

두번째 네모박스에는 특정 영역의 주솟값이 남아있는 모습이다

 

 

 

 

 

vmmap

 

그 특정 영역이 어디인지 보면  ld 영역의 주솟값이다

 

이 ld 주솟값은 libc를 로드하는 과정에서 stack 영역에 값이 남아있게 된다

 

 

 

그리고 저 영역을 확인해보면 여러 주솟값들이 담겨있는데

 

그 중에서 Canary 값이 담겨있는 fs영역의 주소도 담겨 있다

 

(fs영역의 주소가 담겨있는 이유는 libc 로드과정에서 fs영역의 주솟값이 필요하기 때문이다)

 

 

vmmap

 

fs 영역은 위의 네모박스이고

 

저 범위 안에 Canary 값이 들어있는 것을 확인할 수 있다

 

 

이 사진을 기준으로 0x7ffff7dc700이 fs_base 가 되겠다

 

 

즉, 다른 영역에서 fs 주솟값을 남겨두고

 

이를 바탕으로 fs영역의 값을 참조할 수 있는 것이다

 

 

 

 

 


 

 

* 저기에 적힌 것은 fs 영역에 적힌 canary 값이고

 

pwndbg 에서 canary 명령어로 나오는 위치는 ld 위치이다

 

 


 

 

 

 

 

그렇다면 저렇게 남아있는 ld 주솟값과 exit( )는 무슨 연관이 있다는 것일까?

 

exit( ) 함수의 루틴을 살펴보자

 

 

 

register 상황

 

 

si 를 통해 call exit 의 내부를 본 모습

 

 

call exit( ) 의 내부를 쭉 살펴보다 보면 위와 같은 상황이 나오게 되는데

 

call [ r12+rdx*8 ] 을 진행하는 모습이 보인다

 

 

위 상황에서 r12 값은

 

 

.rodata 영역값임을 알 수 있다

 

 

 

그런데 위 add r12, dword ptr [rbx] 를 통해 r12 에  rbx 값이 더해지는 것으로 보이고

 

rbx는 아까전에 알아보았던 ld 영역의 값임을 알 수 있다

 

 

 

결과적으로, fsb 를 통하여 ld 영역의 주솟값인 0x7ffff7ffe168 에

 

값을 적을 수 있다면 r12의 값을 바꿀 수 있을 것이고

 

결국 rip 컨트롤을 할 수 있게 되는 것이다

 

 

 

 

 

 

# 직접해보기