how to bypass PIE with stack information
그렇다면 어떻게 PIE 를 bypass 할 수 있을까? 그 중 첫번째 방법은
스택에 있는 정보를 활용하는 것이다. 가장 대표적인 예시로 스택에 존재하는 main 함수의 주소를 leak하면 PIE 를 bypass 할 수 있다.
Python
pwndbg> stack 10
00:0000│ rbp rsp 0x7fffffffe530 ◂— 1
01:0008│+008 0x7fffffffe538 —▸ 0x7ffff7db7d90 (__libc_start_call_main+128) ◂— mov edi, eax
02:0010│+010 0x7fffffffe540 ◂— 0
03:0018│+018 0x7fffffffe548 —▸ 0x555555555293 (main) ◂— endbr64
04:0020│+020 0x7fffffffe550 ◂— 0x100000000
05:0028│+028 0x7fffffffe558 —▸ 0x7fffffffe648 —▸ 0x7fffffffe869 ◂— '/home/fsb_overwrite/fsb_overwrite/fsb_overwrite'
06:0030│+030 0x7fffffffe560 ◂— 0
07:0038│+038 0x7fffffffe568 ◂— 0x9d46e2b6b99c1917
08:0040│+040 0x7fffffffe570 —▸ 0x7fffffffe648 —▸ 0x7fffffffe869 ◂— '/home/fsb_overwrite/fsb_overwrite/fsb_overwrite'
09:0048│+048 0x7fffffffe578 —▸ 0x555555555293 (main) ◂— endbr64 프로그램이 시작했을 때 Stack을 한번 보면 다음과 같이 0x555555555293 (main)
메인 주소가 스택에 저장되어 있다. 이는 __libc_start_call_main 함수의 인자로 쓰이기 때문이다.
근데 문제는 main 함수 스택에 있는 것이 아니라 main 함수 스택이 넘어서 있다.
따라서 buffer_leak 이 가능하든가 arbitrary_readable 이 가능할때 이 첫번째 방법을 쓸 수 있다.