본문 바로가기
.study/pwnable

[포너블 기초] 버퍼 오버플로우

by Carry_on 2023. 10. 1.

버퍼 오버플로우 문자 그대로 버퍼가 넘치는 것을 의미한다.

 

버퍼 오버플로 발생 시 버퍼에 다 담지 못한 값들은 버퍼 이후의 공간에 들이차게 되는데, 이때 프로그래머가 의도하지 않은 값이 덮어쓰기로 들이차게 되고 여기서 문제가 발생한다.

 

8칸짜리 메모리가 있고, 그 안에 4칸짜리 버퍼가 있을 때

그림과 같이 사용자가 버퍼를 초과하는 값을 입력하면 버퍼 이후의 값이 바뀌게 된다.

 

Return Address Overwrite

 

스택프레임 끝에 존재하는 return address 영역을 덮어쓰기 함으로써, 함수가 끝날 때 원하는 주소, 원하는 함수의 코드로 분기를 변경하는 기법이다.

 

아직 포너블을 배우기 시작한지 얼마 되지 않았지만 대부분의 기법이 이 기법으로 끝나는 것으로 보아 매우 중요한 것 같다.

 

스택 카나리

위의 그림은 카나리 보호기법이 적용된 스택 버퍼이다.

카나리 값을 모르는 공격자는 반환 주소를 덮을 때 카나리 값을 변조하게 된다.

이 경우에 에필로그에서 변조가 확인되어 공격자는 실행 흐름을 획득하지 못한다.

 

카나리 우회

 

무차별 대입

무차별 대입으로 x64 아키텍처의 카나리 값을 알아내려면 연산량이 많아서 현실적으로 어렵다.
x86 에서는 구할 수는 있지만, 실제 서버를 대상으로는 현실적으로 불가능하다.

 

TLS 접근

카나리는 TLS에 전역변수로 저장되며, 매 함수마다 이를 참조해서 사용한다.
TLS의 주소는 매 실행마다 바뀌지만 실행중에 TLS의 주소를 알 수 있고, 임의 주소에 대한 읽기 또는 쓰기가 가능하다면 TLS에 설정된 카나리 값을 읽거나 조작 가능하다.

 

스택 카나리

함수의 프롤르그에서 스택에 카나리 값을 저장하므로, 이를 읽어낼 수 있으면 카나리를 우회할 수 있다.
가장 현실적인 카나리 우회 기법이다.

 

'.study > pwnable' 카테고리의 다른 글

[포너블 기초] Egg Shell, NX-Bit  (0) 2023.10.23
[포너블 기초] Shell Code 만들기  (0) 2023.10.23
[포너블 기초] x86_handray  (0) 2023.09.14
[포너블 기초] 함수 호출 규약  (0) 2023.09.14
[포너블 기초] Docker  (0) 2023.09.13