티스토리 뷰

Pwnable/write up

[PlaidCTF 2014] kappa

xxvd 2018. 9. 26. 18:16

대충 바이너리의 동작은 포켓몬을 잡고, 관리하는 동작을 하는 바이너리이다.




메뉴가 이렇게 5개로 구성이 되고 1번 메뉴에서 풀숲으로 들어가 포켓몬을 잡을 수 있다.



1번 메뉴 내부의 함수로 들어가면 이렇게 나오는데 넘겨지는 인자에 따라 포켓몬 정보를 가지고 fight 함수를 실행한다.


(인자가 1이면 charizard, 2이면 kakuna)


fight 함수에서는 1,2,3번 메뉴가 있는데 1번은 공격, 2번은 포켓볼 던지기, 3번은 도망치기 이다.


이렇게 포켓몬을 잡을 수 있는데 




이 부분은 fight 함수에서 포켓몬을 잡고 추가할 때 인벤토리가 다 차있을 경우에 예외처리를 해주는 부분이다. 


그런데 choose pokemon으로 포켓몬을 선택한 후 해당 포켓몬을 free 하고 그 위치에 잡은 포켓몬을 대입시킨다.(검사를 하지 않고)


여기서 다른 타입의 포켓몬이 대입된다면 만약 그 포켓몬의 크기가 크면 다른 메모리에 접근 가능하다.


그래서 메모리를 덮어쓸 수 있는 메뉴를 찾아봤더니 5번 메뉴인 change pokemon artwork 에서 메모리를 덮어쓸 수 있다는 것을 알았다.


charizard -> kakuna 로 변경하면 타입 컨퓨젼이 일어나고 5번 메뉴로 memcpy를 해서 구조체를 덮어씌울 수 있다.






charizard와 kakuna 구조체 모두 내부적으로 이런 정보를 print 해주는 함수를 가지고 있다. 여기서 보면 a1+524를 인자로 더블포인터로 참조해서 인자로 받아 출력해주는 것이 보인다. 그리고 a1+524는 어셈으로 보면




이렇게 되어 있으므로 5번메뉴의 memcpy를 통해 변조해 줄 수 있다. 


그리고 3번 메뉴에서 저 함수를 실행 하므로 릭을 할 수 있다. 


익스플로잇은 릭한 것을 토대로 system함수를 불러와 저장된 kakuna의 이름인 "/bin/sh"를 인자로 3번메뉴로 print 함수를 호출하여 rtl 하면 된다.


그리고 릭을 할 때 더블 포인터로 인자 전달을 하므로 read의 plt를 인자로 전달해주면 된다.


비오비 노트북 윈도우 계정명이 한글이어서 그거 바꿀려고 하다가 뭐 잘못만졌는지 모르겠는데 윈도우가 그냥 초기화 돼버렸다;; 익스도 증발

'Pwnable > write up' 카테고리의 다른 글

P.W.N ctf exploitClass  (0) 2018.11.18
P.W.N ctf write up  (0) 2018.11.04
[DEFCON 2015] r0pbaby  (0) 2018.09.16
[Sunrin Internel CTF] cee  (0) 2018.09.16
[PlaidCTF 2013] ropasaurusrex  (0) 2018.09.16
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함