call gadget in __libc_csu_init

프로그램에 __libc_csu_init 라는 전형적인 함수가 존재한다. (.init_array 자동 초기화 루틴)

근데 해당 코드를 어셈블리로 보면

C
0000000000400859                 call    ds:(funcs_400859 - 600DB0h)[r12+rbx*8]

와 같은 상당히 취약한 코드가 된다. r12 와 rbx를 조작하면 해당 위치에 있는 주소로 jump를 하게된다. 물론 취약한데 해당 위치에 원하는 system과 같은 주소가 있을 확률은 상당히 낮다.

→ 지금 생각해보면 got 영역을 모두 사용 할 수 있네 사기인데

근데 생각을 해보면 바이너리 내에 이미 glibc 주소가 있는 부분이 있다. 바로 stdout과 stdin이다. 해당 부분의 하위 몇바이트를 system ( 물론 one shot도 됨 ) 으로 덮을 수 있으면 일정 확률로 공격이 성공할 수 있는 bruteforce 공격이 가능하다. 근데 이는 오프셋도 중요하고 여러 요인이 중요하게 작용한다.

좀더 최적화 한다면,

덮는 것보다 해당 stdout stdin 값에 더하는 건데

C
0x0000000000400668 : add dword ptr [rbp - 0x3d], ebx ; nop dword ptr [rax + rax] ; repz ret

다음과 같은 가젯이 있다면 [rbp - 0x3d] 해당 위치에 stdout 주소를 맟춰서 system으로 맟춘다음에 실행하면 된다. ( 물론 one shot도 됨 )