스택 버퍼 오버플로우를 위한 페이로드 길이 계산하는 방법?
교재에 있는 exploit 파이썬 코드에서 Canary 얻기 위해 사용한 길이 0x39(buf = b"A"*0x39)와 RTL을 위해 사용한 페이로드 길이 0x38(payload = b"A"*0x38 + ...)를 계산하는 방법을 구체적으로 알고 싶습니다. GDB를 이용해서 알아낸다고 하는데 절차가 궁금합니다.
#pwnable
작성자 정보
답변
1
Dreamhack
대표 업적 없음
canary의 위치를 먼저 알아내야 하는데요, gdb 로 어셈블리를 보시면
0x00000000004006f7 <+0>: push rbp
0x00000000004006f8 <+1>: mov rbp,rsp
0x00000000004006fb <+4>: sub rsp,0x40
0x00000000004006ff <+8>: mov rax,QWORD PTR fs:0x28
0x0000000000400708 <+17>: mov QWORD PTR [rbp-0x8],rax
처럼 되어있습니다. 이 말은 스택 카나리의 위치가 $rbp-8 이라는 뜻입니다.
메인 함수의 코드에다가 breakpoint를 걸었다면, rbp 는 항상 동일한 상태니 언제든지 이를 확인할 수 있고, user input을 받았을때 이 값이 바뀌었는지 , 어떤 값으로 바뀌었는지를 확인하는 것으로 페이로드 길이를 계산할 수 있습니다.
혹은 read 함수를 호출하는 루틴에서
0x0000000000400772 <+123>: lea rax,[rbp-0x40]
0x0000000000400776 <+127>: mov edx,0x100
0x000000000040077b <+132>: mov rsi,rax
0x000000000040077e <+135>: mov edi,0x0
0x0000000000400783 <+140>: call 0x4005f0 <read@plt>
이와 같이 buf 주소가 rbp-0x40 인 것을 볼 수 있습니다.
canary - rbp (sfp) - return address 는 항상 일정하게 이어져 있으니 이를 통해서 페이로드의 길이를 계산하셔도 됩니다.