LIBC base
저기서 libc가 시작하는 주소, 즉 바이너리가 매핑되기 시작하는 부분을 libc base라고 한다.
당연히 다이나믹 링킹에만 해당되는 말이다.
0x00007ffff7dcc00 ~ 0x00007ffff7dee000에 해당한다.
기본적으로 리눅스 커널단에서 ASLR을 지원해서 libc가 매핑된 주소는 계속 바뀐다.
그래서 특정 부분을 가리키기 위해 base를 구한다.
바이너리의 세그먼트들이 그대로 매핑되는 거라서 당연히 libc base를 알면, 특정 부분의 주소도 계산할 수 있다.
libc base + offset = address 가 된다.
이를 통해 libc 내부 함수들을 호출할 수 있다.
여기서 offset은 base부터의 떨어진 거리이다.
GOT overwrite
PLT가 참조하는 table이 GOT이다.
이 got는 libc의 특정 부분을 포인팅하는 함수 포인터이다.
이 함수 포인터를 덮는 것을 got overwrite라고 한다.
당연히 got도 바이너리에 딸려있는 것이라서, 굳이 PIE가 없으면 주소가 고정된다.
기존 함수처럼 호출이 되서, 인자도 그 함수의 인자 그대로 들어간다.
puts("/bin/sh") 가 있고 puts got를 system으로 덮으면 쉘을 딸 수 있다.
당연히 이때는 got에 쓰기 권한이 존재할때 이용할 수 있다.
즉, Full Relro에서는 got overwrite를 할 수 없다.
got_overwrite
main 함수의 모습이다.
함수 포인터 8바이트를 덮을 수 있다.
그러면 printf의 got를 system의 plt로 덮으면 된다.
got_overwrite_v2
입력을 받고, 거기에 쓸 수 있다.
대신 32비트 버전이다.
똑같이 하면 된다.
puts got를 덮어주면 된다.
'Layer7 동아리 과제' 카테고리의 다른 글
포너블 마지막 과제 (0) | 2022.10.31 |
---|---|
포너블 4차시 과제 (0) | 2022.10.05 |
포너블 3차시 과제 (0) | 2022.09.25 |
포너블 2차시 과제 (0) | 2022.09.21 |
포너블 1차시 과제 (0) | 2022.09.18 |