Pwnable

strtap address overflow

ksg97031 2015. 10. 18. 12:53


call plt -> jmp got -> jmp _dl_runtime_resolve -> call _dl_fixup

메모리에 올려진 동적 C 라이브러리에서 특정 함수에 주소를 가지고 올 때의 루틴이다.

dynamic section에 존재하는 strtap 주소를 참고하여, strtap 내부에 있는 함수명의 문자열을 갖고 온다.


dynamic section + ? : strtap

strtap + offset(?) : "puts"

puts got = puts함수의 주소가 저장됨


이런 식이다.

그래서 만약 strtap에 쓰기 권한이 있어서 puts를 system으로 변경 한다면 system 함수의 주소가 puts got에 저장 된다.

하지만 strtap에 권한은 READ ONLY, 그래서 우리가 Overflow 할 부분은 dynamic section + ? 이다.


64bit 환경에서 strtap에 주소를 가지고 있는 부분은, dynamic+136 이다.

만약 dynamic+136 부분을 bss 영역으로 하고, bss+offset(for puts) 위치에 system이란 문자열을 두면 된다.


dynamic section + 136 : bss address

bss+0xb : "system"

(내 환경에서의 puts 문자열을 strtap+0xb에 있었다.)

puts got = system함수의 주소가 저장