rbp gadget
프로그램은 흔히 rbp를 사용해서 함수 내에 스택을 관리하는데 이때 rbp를 바꾸고 싶어도 대부분 aligned 문제와 프로그램이 망가지기 때문에 rbp를 건드리지 못한다. 근데 이러면 코드에 대부분이
Bash
.text:000000000040082B mov rax, [rbp+var_18]
.text:000000000040082F mov [rbp+var_10], rax
.text:0000000000400833 lea rdi, aOffset ; "offset: "
.text:000000000040083A mov eax, 0
.text:000000000040083F call _printf
.text:0000000000400844 lea rax, [rbp+var_20]
.text:0000000000400848 mov rsi, rax
.text:000000000040084B lea rdi, aD ; "%d"
.text:0000000000400852 mov eax, 0
.text:0000000000400857 call ___isoc99_scanf
.text:000000000040085C mov eax, [rbp+var_20]
.text:000000000040085F mov esi, eax
.text:0000000000400861 lea rdi, aMemoryD ; "memory[%d]: "
.text:0000000000400868 mov eax, 0
.text:000000000040086D call _printf
.text:0000000000400872 mov eax, [rbp+var_20]
.text:0000000000400875 cdqe
.text:0000000000400877 lea rdx, ds:0[rax*4]
.text:000000000040087F mov rax, [rbp+var_10]
.text:0000000000400883 add rax, rdx
.text:0000000000400886 mov rsi, rax
.text:0000000000400889 lea rdi, aD ; "%d"다음과 같이 rbp 위주로 돌아가기 때문에 스택에 있는 내용을 사용하지 못한다.
이때 다른 함수에 있는 rbp를 사용하는 가젯을 이용하면 쉽게 스택을 다룰수 있다.
예를 들어
Bash
.text:00000000004008F9 add rax, 70h ; 'p'
.text:00000000004008FD mov dword ptr [rax], 1
.text:0000000000400903 mov rax, [rbp+var_8]
.text:0000000000400907 add rax, 40h ; '@'
.text:000000000040090B mov dword ptr [rax], 1
.text:0000000000400911 mov edi, 3Ch ; '<' ; seconds
.text:0000000000400916 call _alarm이런식으로 완전 다른 함수에서도 rbp를 사용하기 때문에 가젯으로 사용하고
_alarm의 got를 overwrite해서 다시 돌아올 수 있다.