본문 바로가기

System Hacking/CTF

[CodeGate_2013] pwn500 kpop_music

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가 아직 존재하므로, 조작된 메모리를 통해 함수포인터를 찾을 것이다.






kpop_music


kpop_music.id0


kpop_music.id1


kpop_music.idb


kpop_music.nam


kpop_music.til


'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