printf got를 overwrite 했을 경우에 shell을 획득하지 못하는 이유를 알고 싶습니다.
tcache의 chunk list를 활용해서 got overwrite를 하는데
puts_got의 경우 shell을 획득할 수 있지만 printf_got의 경우 shell을 획득하지 못했습니다.
#free(0), free(1)
tcache: chunk B -> chunk A
#Modify_heap(1, 0x10, p64(e.got['puts']))
tcache: chunk A -> puts_got
#Create_heap(0x10, b'A')
tcache: puts_got
#Create_heap(0x10, p64(e.sym['get_shell'])
위와 같은 과정을 통해 puts_got를 overwrite한 경우 shell을 획득할 수 있었지만
printf_got를 활용한 경우 shell을 획득할 수 없는 이유를 알고 싶습니다.
#pwnable
작성자 정보
답변
1
qwerty
CTF First Place
일반적으로, got_overwrite에 성공하였으나 공격이 실패하는 경우는 아래와 같습니다.
-
함수 호출 시 인자가 올바르지 않은 경우.
- 예를 들어,
printf("%s", &a)
의 printf got를system()
으로 덮은 경우,system("%s")
가 실행되어 공격에 실패합니다.
- 예를 들어,
-
stack 정렬이 되어 있지 않아, xmm오류가 발생하는 경우
- 일반적으로, 함수의 시작점으로 got를 덮은 경우 오류가 발생하지 않습니다. 다만 함수의 중간으로 이동하는 경우 해당 오류가 발생할 수 있습니다.
위 두 내용을 염두하여, gdb로 동작을 확인해보면 문제를 해결할 수 있을 것으로 보입니다!