rbp rsp poisioning
뭔가 요즘 문제를 풀때 bof를 하다보면 rbp가 당연히 쓰레기값이 채워질것이고
코드가 끌날때 leave 명령어에서 pop rbp를 하기에 rbp 레지스터가 쓰레기 값으로 바뀌어 버린다…
이러한 쓰레기 값이 rtm( return to main )이 필요할때 정말 귀찮게 된다. 왜냐면 일반적인 코드에서 스택을 사용할때 rbp를 사용하기 때문인데 일단 자세히 분석을 해본결과 다음과 같은 경우의 수를 나눌 수 있다.
- rsp는 그대로 니깐 다시 함수 초기에서 rbp를 덮기
Python
.text:0000000000401572 push rbp
.text:0000000000401573 mov rbp, rsp현재 leave 명령어 이후에 rbp는 쓰레기 값으로 변했지만, rsp는 바뀌지 않는다.
따라서 이때 rtm으로 함수 시작부분을 다시 실행하면 mov rbp, rsp 으로 다시 rbp를 rsp로 되돌려서 정상적인 실행이 가능하다.
- rbp에 그냥 내가 원하는 주소를 넣고 rsp까지 오염시키기
이건 좀 고급적인데 일단 bof를 할때 기존 rbp가 있는 위치에 내가 원하는 주소 (ex.bss 섹션 주소 ) 를 넣는다. 그리고 leave 명령어 이후에 rbp는 해당 값으로 변할 것이다. 이때 ROP로
Python
.text:00000000004016E4 leave
.text:00000000004016E5 retn함수 끝 부분을 실행해주면 leave 명령어를 다시 실행하면,
현재 rbp값이 rsp로 들어간다. 따라서 rsp까지 오염을 시킬 수 있다.