https://www.blackhat.com/docs/asia-18/asia-18-Marco-return-to-csu-a-new-method-to-bypass-the-64-bit-Linux-ASLR-wp.pdf
나중에 Tech blog에 예제 익스까지 해서 올려놓겠다.
__libc_init_csu에 있는 가젯들을 사용해서 pop rdi, rsi, rdx 같은 가젯 없이 함수를 call 할수 있는 방법이다.
이 2개를 엮어서 사용하는건데,
먼저 pop rbx; pop rbp; ... ; ret 가젯으로 각 레지스터를 세팅한다.
r12에는 원하는 함수의 ptr 주소 ( got )를 넣고, rbx 에는 0 을 넣는다. ( 상황에 따라 적당히 옵셋 계산해서 넣을 수 있다 ).
그리고 r15, r14, r13에 차례로 1, 2, 3 번째 인자값을 넣어준다.
그 이후 mov rdx, r13; mov rsi, r14; mov edi, r15d; call [r12 + rbx*8] 가젯으로 함수를 call 하면 된다.
유의할점은 mov edi, r15d 라서 32bit 값밖에 들어가지 않는다는거다. 하지만 read, write 같은거는 상관없으니까 짱짱좋다
뭔가 문서에는 디게 길게 나와서 내가 캐치하지 못한것도 있을거 같은데, 일단 내가 읽으면서 이해한건 이거다.