# 들어가기전에
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 상황을 한번 살펴보면
첫번째 네모박스에는 Canary 값이 stack 에 들어있는 모습이고
두번째 네모박스에는 특정 영역의 주솟값이 남아있는 모습이다
그 특정 영역이 어디인지 보면 ld 영역의 주솟값이다
이 ld 주솟값은 libc를 로드하는 과정에서 stack 영역에 값이 남아있게 된다
그리고 저 영역을 확인해보면 여러 주솟값들이 담겨있는데
그 중에서 Canary 값이 담겨있는 fs영역의 주소도 담겨 있다
(fs영역의 주소가 담겨있는 이유는 libc 로드과정에서 fs영역의 주솟값이 필요하기 때문이다)
fs 영역은 위의 네모박스이고
저 범위 안에 Canary 값이 들어있는 것을 확인할 수 있다
즉, 다른 영역에서 fs 주솟값을 남겨두고
이를 바탕으로 fs영역의 값을 참조할 수 있는 것이다
* 저기에 적힌 것은 fs 영역에 적힌 canary 값이고
pwndbg 에서 canary 명령어로 나오는 위치는 ld 위치이다
그렇다면 저렇게 남아있는 ld 주솟값과 exit( )는 무슨 연관이 있다는 것일까?
exit( ) 함수의 루틴을 살펴보자
call exit( ) 의 내부를 쭉 살펴보다 보면 위와 같은 상황이 나오게 되는데
call [ r12+rdx*8 ] 을 진행하는 모습이 보인다
위 상황에서 r12 값은
.rodata 영역값임을 알 수 있다
그런데 위 add r12, dword ptr [rbx] 를 통해 r12 에 rbx 값이 더해지는 것으로 보이고
rbx는 아까전에 알아보았던 ld 영역의 값임을 알 수 있다
결과적으로, fsb 를 통하여 ld 영역의 주솟값인 0x7ffff7ffe168 에
값을 적을 수 있다면 r12의 값을 바꿀 수 있을 것이고
결국 rip 컨트롤을 할 수 있게 되는 것이다
# 직접해보기
'System Hacking > Study Notes' 카테고리의 다른 글
내 힙(heap) 어때? (0) | 2020.04.06 |
---|---|
pwndbg> command (0) | 2020.01.13 |
Shellcode (0) | 2020.01.07 |
pwntool 함수 (0) | 2020.01.07 |
LD 와 libc.so.6 (0) | 2019.12.29 |