본문 바로가기

System Hacking

[드림핵] hook (hook overwrite) 풀이 - 티스토리

 

 

 

 

 

코드를 처음 보고 당황했는데 역시 계속 보니까 이해가 된다

 

 

 

이해하고 보니까 그다지 어려운 문제는 아니고 그냥 hook overwrite하는 문제같다

 

 

 

 

코드 분석

 

먼저 gdb 스택 내부를 본다

 

 

main stack frame

 

사실 이번 문제는 ret를 덮는게 목적이 아니므로 stack 내부는 딱히 중요하지는 않아 보인다

 

 

 

코드 내에서 system("/bin/sh")이 주어져 있으므로 이걸 활용하는 쪽으로 생각했다

 

 

 

 

.1. __free_hook 주소 릭

 

 2. __free_hook주소가 가리키는 값을 코드 내 system("/bin/sh")로 덮으면 free함수 실행시 쉘이 따인다

 

 

 

__free_hook주소는 코드 내 stdout 주소를 출력하고 있는 부분을 통해 릭 가능하다

 

 

 

 

다음은 

 

이 부분을 해석하는게 관건이다

 

 

 

내 해석이 맞는지는 모르겠지만 문제가 풀린거로 봐선 맞는거 같다

 

 

 

먼저 ptr + 1 -> 이거는 ptr이 가지고 있는 주소 한 칸 다음 칸, 즉 64비트 환경이고 자료형이 long인 것을 감안하여 8바이트 뒤인 주소를 의미하고 *(ptr + 1)이므로 그 주소가 가지는 값을 뜻한다

 

 

*(long * )* ptr -> 이거는 우선 *ptr부터 보면, ptr 이 가지는 주소값이 가지는 값을 의미하고 그 값을 자료형이 long인 포인터로 형변환을 해준다. 

 

그 후 형 변환된 변수는 ptr이 가리키는 주소값의 값이 주소값을 가지는 포인터 변수가 된 것이고

 

 그 포인터 변수가 가리키는 주소의 값을 의미한다

 

 

결론, ptr이 가리키는 주소의 다음 칸 (8바이트 뒤 값)이 가지는 값을

 

 

ptr이 가리키는 주소의 값을 포인터 변수로 형변환 시킨 변수가 가리키는 주소의 값에 넣어준다는 의미다

(이 말은 즉 __free_hook이 가리키는 주소의 값에 system 주소를 넣어준다)

 

 

따라서 read입력 부분에서 ptr이 할당받은 곳에 에 __free_hook주소를 넣어주고 ptr + 1에 코드내 system주소를 넣어주면 

 

 

free 함수 실행 시 코드내 system("/bin/sh")을 실행 시킬 수 있다

 

 

최종 페이로드

 

여기서 처음에 system 주소로 0x400a16을 넣었는데 쉘이 안 따여서 0x400a11로 바꿨더니 따였다

 

 

정확히는 모르겠는데 system함수에 인자로 넘겨주는 부분이 없어서 그런 거 같다

 

 

근데 한 가지 궁금한게 0x400a11부분 코드 실행하고 왜 0x400a16까지 실행하는건지 이해가 잘 안돼서 질문을 통해 해결할 예정이다

 

 

->

 

너무 당연한 사실을 간과했다