스택 버퍼 오버플로우를 위한 페이로드 길이 계산하는 방법?

교재에 있는 exploit 파이썬 코드에서 Canary 얻기 위해 사용한 길이 0x39(buf = b"A"*0x39)와 RTL을 위해 사용한 페이로드 길이 0x38(payload = b"A"*0x38 + ...)를 계산하는 방법을 구체적으로 알고 싶습니다. GDB를 이용해서 알아낸다고 하는데 절차가 궁금합니다.

#pwnable
작성자 정보
답변 1
avatar
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 는 항상 일정하게 이어져 있으니 이를 통해서 페이로드의 길이를 계산하셔도 됩니다.

2022.04.13. 11:46
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기