티스토리 뷰

Pwnable/CTF

Plaid CTF 2014 [Kappa]

err0rless313 2015. 4. 6. 20:21

Plaid CTF 2014 Kappa - 275Points


Download from : http://shell-storm.org/repo/CTF/PlaidCTF-2014/Pwnables/kappa/

or 

kappa




바이너리에 걸린 보호 기법은 NX-Bit밖에 없다. Xinetd로 돌아가는 서비스 이기 때문에 ASLR도 

특별히 신경을 써 주어야 한다.


바이너리를 실행 시켜 보면 5가지의 메뉴를 선택 할 수 있고 대부분 단순한 알고리즘으로

돌아가고 있다.



1번으로 들어가면 포켓몬을 잡을 수 있고 2번은 치료 3번은 현재 포켓몬들의 상태를 볼 수 있는

서비스를 제공해 준다. 4번은 포켓몬 방생, 5번은 포켓몬의 삽화를 자신이 직접 바꿀 수 있게 해준다.



Vuln



포켓몬은 총 3가지 타입으로 나뉜다.


Bird_Jesus, Charizard, Kakuna인데 세 포켓몬 모두 구조체로 정의 되어 있다.




포켓몬은 기본 포켓몬인 Bird Jesus 포함 총 5마리 까지 보유할 수 있는데,

무조건 Kakuna 4마리 출현 -> Kakuna 2마리 출현 -> Charizard 출현 이 되도록

알고리즘이 짜여져 있다.


그런데 여기서 중요하게 봐야 할 점은 BATTLE함수이다. 여기서 취약한 부분이 노출된다.



5마리가 꽉 차고 나면 다른 포켓몬과 바꿔야 하는데 바꾸는 방법이 그냥 무조건 적인 대입을

해버리는 것이다 (free나 memset같은 것이 아니라 그냥 '='으로 대입 해버림)


여기서 만약 두 포켓몬의 타입이 다를 경우에는 필드의 크기가 맞지 않기 때문에 정상적인

이용이 불가능 하다는 것이다.


그리고 이부분을 통해서 변조해야할 건 모든 포켓몬 구조체에 존재하는 function_status이다.



function_status는 현재 포켓몬의 상태를 출력해주는 함수로, 모든 포켓몬당

다른 함수를 가지고 있다. (Charizard는 print_Charizard라는 함수가 따로 존재한다.)


그리고 이 function_status는 menu 3번에 해당하는 곳에서 실행이 된다.

만약 이 function_status를 변조한 후 menu_3을 실행하면 우리가 변조한 함수가

실행이 될 것이다.


-> 중요한 점은 function_status의 인자가 되는 값은 그 포켓몬의 name값이 된다.

-> 마지막 ATTACK 필드를 출력할 때는 2중 포인터로써 출력 한다.



PWNING



총 두개의 스테이지로 이루어져 익스플로잇을 시도할 것이다.


첫번째는 LIBC의 주소를 LEAK해서 system@libc의 주소를 구하는 것이고

그 다음은 구한 system@libc를 이용하여 쉘을 따낼 것이다.



Stage - 1


우리는 function_status말고도 attack이나 attack_power를 변조 할 수 있다.

attack_power는 인트형이기 때문에 딱히 상관 없고 attack은 (char *)을 가지고 있고

function_status상에서 이중 포인터로 값을 출력하기 때문에 LIBC주소를 릭하는 데에는 제격이다.


원래 1중 포인터 였으면 attack에 read@got를 넣어서 릭하면 되지만

2중 포인터 이기 때문에 got를 가르키는 plt를 넣어야 한다. 


[*] PLT -> GOT -> LIBC // 정확하진 않지만 대충 이런식으로 이해하면 된다.





read@plt의 시작인 0x08048510부분에서 2만큼 떨어진 곳에 read@got를 가르키는 곳이 보인다.

저 곳이 kakuna->attack이 될 주소이다.


그러면 직접 read@libc를 릭 해보도록 하자.



덤프를 뜬 곳을 보면 0xb76a6ef0이 나왔고 이 주소는 read@libc의 주소이다.

또한 "%s" format string을 사용하였기 때문에 0x00을 만날때 까지 모든 LIBC의 주소들을 출력해 주었다.



Stage - 2


이제 나머지는 간단하다. 


function_status를 위에서 구한 system@libc의 주소로 바꾸고 나서 print_kakuna를 실행시켜 주면

쉘을 딸 수 있을것이다. 물론 포켓몬의 이름은 /bin/sh로 해주어야 system("/bin/sh");를

정확하게 실행시켜 줄 수 있다.


[*] payload를 줄 때는 change_artwork 탭을 이용하도록 하자.

    "A" * 513 이후에 바로 function_status가 위치해 있다.



[+] flag값은 임의로 정하였습니다.


LAST EXPLOIT CODE


[*] 원래 익스플로잇 코드가 이렇게 길면 안되는데 최대한 깔끔하게 하려고 노력하다 보니

    이렇게 됐습니다. ㅠㅠ




'Pwnable > CTF' 카테고리의 다른 글

Inc0gnito 2015 anti-hexray exponly  (0) 2015.08.25
0CTF 2015 [FlagGenerator]  (2) 2015.04.16
CODEGATE 2015 JUNIOR [ SYSTEMSHOCK ]  (0) 2015.03.28
CODEGATE 2015 JUNIOR 예선 WRITE UP  (0) 2015.03.16
CodeGate Junior 2014 [lotto]  (0) 2015.02.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함