Return To CSU(A.K.A RTC)

728x90

요약

- ROP를 위한 가젯이 존재하지 않을때 사용 가능(예를 들어 pr, ppr, pppr 등등)

- __libc_csu_init 내의 로직을 이용하여 레지스터에 값을 저장

 

분석

바이너리는 HackCTF의 RTC 바이너리를 기준으로 설명

0x4006a0 부분을 보면 R13, R14, R15D의 값을 각각 RDX, RSI, EDI에 저장하고, r12+rbx*0x8의 주소값을 호출 하는것을 볼 수 있다.

또한  0x400b6b에서는 레지스터들의 값을 pop하는것을 볼 수 있다.

 

따라서 0x4006a0 부분을 이용하여 원하는 인자를 넣고, 0x4006b6을 호출하면 끝

 

Jsec님이 이러한 rtc를 쉽게 사용할 수 있는 함수를 작성하였다.

해당 함수를 보면 add rsp, 0x8을 넘기 위해 'A'*8을 작성하였고 pop rbx에는 0, pop rbp는 1을 넣어줬다.

그 이유는 0x4006a9에서 [r12+rbx*0x8]의 주소에 담긴 값을 호출하는데, 이때 rbx가 0이 되면 r12만 남고, r12에 원하는 값을 넣으면 그 값을 정확히 실행할 수 있기 때문. 단 이때 r12에 들어가는 값은 plt가 아니라 got여야 한다.

 

그리고 rbp가 1이면 다시 0x4006a0으로 가 연속적으로 함수를 호출하는 것이 가능하다.

 

출처 : Jsec님 블로그

def chain(got, A, B, C, csu_call):
        payload = ''
        payload += 'A' * 8
        payload += p64(0)
        payload += p64(1)
        payload += p64(got)
        payload += p64(C)
        payload += p64(B)
        payload += p64(A)
        payload += p64(csu_call)

        return payload
728x90

'Technique' 카테고리의 다른 글

함수 호출 규약  (0) 2022.01.16
Heap Fengshui  (0) 2022.01.13
pwntools - ret2dlresolve  (0) 2021.12.13
Return to dl resolve  (0) 2021.12.13
gdb로 C++ 바이너리 분석시 함수 깨질때  (0) 2021.12.02