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 이 가능할때 이 첫번째 방법을 쓸 수 있다.