Let's count words.
Analysis
generate_me()
는 strings
에 저장된 10개의 문자열들 중 하나를 골라서 이어붙이는 과정을 20번 반복하여 me
문자열을 생성한다. strings
에서 가장 짧은 문자열은 3바이트이고 가장 긴 문자열은 8바이트이기 때문에, me
는 이론상 최소 60바이트에서 최대 160바이트까지 될 수 있다. me
가 너무 길어지면 you
에 입력을 받을 때 stack buffer overflow가 발생할 수 있다.
Exploitation
Leak canary
you
는 rsp+0x10
부터 입력을 받기 때문에, me_len
이 0x68
이상이면 canary의 null byte까지 채워서 canary를 leak할 수 있다.
Leak PIE
me_len
이 0x77
이상이면 return address 직전까지 채워서 PIE base를 leak할 수 있다.
이후 me_len
이 0x79
이상이면 return address의 하위 2바이트만 덮어써서 win()
으로 return하도록 만들 수 있다.
728x90