H문제 파일을 보면 32비트 파일임을 확인할 수 있고, 보호기법을 확인하면 canary와 nx가 적용되어 있음을 확인할 수 있다.
파일을 실행시키면 노트 추가, 삭제, 출력 기능이 있는 것을 확인할 수 있다.
아이다로 사용된 함수들을 보면 다음과 같다.
일단 system 함수로 flag를 출력하는 magic 함수를 호출하는것이 목적인거 같다.
main 함수에서 사용자의 입력에 맞게 함수를 실행시켜 준다.
add_note 함수에서는 notelist 라는 전역변수 배열에 값이 있는지 확인하고, 없으면 8만큼 동적할당을 해준다. 그리고 notelist의 각 요소에 순서대로 입력한 크기만큼 동적할당을 해준다.
del_note 함수에서는 추가한 note를 삭제하면서 free를 해주고 있다. free할때는 먼저 배열의 요소에 할당한 메모리를, 그리고 그 배열 공간을 해제해준다.
print_note 함수에서 인덱스를 입력받고, 그 인덱스에 해당하는 note를 출력한다.
del_note함수에서 free를 한 후 할당했던 메모리 공간을 초기화하지 않아서 UAF 취약점이 발생한다.
add_note 함수에서 8을 동적할당해 줄 때 print_note_content 라는 함수 포인터를 할당하는 것을 확인할 수 있다.
add_note 함수를 호출 하여 값을 입력한 후 bp를 잡고 메모리 영역을 확인해보면 다음과 같다.
notelist 배열에 저장되어있는 주소값에 입력값이 저장된 주소를 갖고있고, 그 주소에 접근하면 입력된 값이 저장되어 있는 것을 확인할 수 있다. 그러나 free 이후에도 입력값을 저장하는 주소에 대한 값은 초기화되지 않는다.
따라서 notelist의 0x0966f160 자리에 magic함수 주소를 넣으면 magic 함수를 실행시킬 수 있다.
free를 하면 함수포인터를 저장하기 위한 공간인 8바이트와 사용자가 입력한 크기가 해제되기 때문에 add_note를 두 번 호출한 후 만들어진 두 공간을 모두 해제하고, 8바이트를 할당하면 함수 포인터가 저장된 공간에 사용자 입력값이 들어가므로 입력값으로 magic 함수의 주소를 넣어 해당 함수를 실행시킬수 있다.
이 과정을 익스 코드로 작성하면 다음과 같다.
'Security & Hacking > Wargame' 카테고리의 다른 글
[Hack CTF] Beginner_Heap (0) | 2021.10.18 |
---|---|
[HackCTF] RTC (0) | 2021.10.06 |
[HackCTF] Yes or no (0) | 2021.08.23 |
[HackCTF] Look at me (0) | 2021.08.06 |
[HackCTF] RTL_Core (0) | 2021.07.30 |