UAF 문제를 공부하려고 풀어본 문제
헥스레이로 흐름을 확인해보니.. 2종류의 구조체가 정의되어있는듯했다.
첫번째 구조체는 구조체 배열의 주소와 갯수를 나타내고
두번째 구조체는 함수포인터, 제목(문자열), url 길이, url 의 주소를 나타낸다.
함수 포인터가 존재하는 구조체 -> 이런경우 대개 UAF문제인듯
문제를 풀면서 여러가지로 이상한 부분이 많았다.
2번째 구조체의 초기화부분
함수 포인터 주소 밑에는 공격가능한 함수
이 문제의 취약점은 저부분이다
unsinged int를 signed int로 형변환하므로 음수값을 넣으면 조건절이 참이된다.
그리고, song_info의 주소를 계산하는과정에서 4*number + a1->song_info_addr 으로 계산한다.
아무리봐도 계산하는 방식이 이상하다.
만약 number가 0x100000000 / 4 의 값이라면 -1073741824가 된다.
4*number + a1->song_info_addr 결과, Integer-Overflow가 일어나므로 0번째 song_info가 지워지게 된다.
그냥 number에 0을 입력해 지우는것과의 차이는 그 밑부분에 난다.
삭제 이후 for문에서 원래는 song_info 배열을 재배치해주지만
number가 (unsinged int) 0x40000000 이므로 재배치되지 않는다.
결과적으로 0번 song_info는 free되었지만 논리적으로는 아직 존재하게된다.
이제 이부분을 사용하면된다. 0번 song_info의 함수포인터 주소를 바꿀 수 있다면 원하는 함수를 호출시킬 수 있다.
modify 함수과정을 보면 함수포인터를 통해 title과 url을 재설정하는걸 볼 수 있다.
이 때 주의깊게 봐야하는건 url부분 -> 함수포인터가 가리키는 함수를 보면 위에 나타낸 0x8048c00이다.
malloc 이후 strcpy 로 진행된다. 이 때, 0번 song_info에 할당되어있던 메모리는 이미 free되었으므로
이부분에 메모리가 할당되게 된다. 이부분을 조작할 수 있다.
논리적으로는 0번 song_info가 아직 존재하므로, 조작된 메모리를 통해 함수포인터를 찾을 것이다.
'System Hacking > CTF' 카테고리의 다른 글
Codegate 2015 푼거 + 풀다만거 정리 (0) | 2015.03.16 |
---|---|
CSAW 2014 pwn_500 xorcise (0) | 2015.01.07 |
Volga CTF - exploitation 100 (Timing attack) (0) | 2014.12.14 |
Plaid_CTF_2013 ropasaurusrex (0) | 2014.11.19 |
CSAW_2012 exploitation 500 (0) | 2014.11.19 |