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해서 다시 돌아올 수 있다.