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
avatar
qwerty
CTF First Place

일반적으로, got_overwrite에 성공하였으나 공격이 실패하는 경우는 아래와 같습니다.

  1. 함수 호출 시 인자가 올바르지 않은 경우.

    • 예를 들어, printf("%s", &a)의 printf got를 system()으로 덮은 경우, system("%s")가 실행되어 공격에 실패합니다.
  2. stack 정렬이 되어 있지 않아, xmm오류가 발생하는 경우

    • 일반적으로, 함수의 시작점으로 got를 덮은 경우 오류가 발생하지 않습니다. 다만 함수의 중간으로 이동하는 경우 해당 오류가 발생할 수 있습니다.

위 두 내용을 염두하여, gdb로 동작을 확인해보면 문제를 해결할 수 있을 것으로 보입니다!

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