티스토리 뷰

Pwnable/CTF

Codegate 2015 Bookstore

err0rless313 2015. 9. 14. 01:59

Category: Pwnable Points: 400 Solves: TODO Description:


bookstore



Canary, NX, ASLR, PIE가 걸려있다. ROP를 하기엔 무리가 있는 난이도이다.





기본적인 동작과정은 메뉴들을 보면 대충 유추가 가능하다.

Bookstore라는 이름과 같이 책정보를 기록하고 관리하는 프로그램이다.





로그인 아이디와 패스워드는 각각 helloadmin / iulover!@#$이다.



여기서 책을 구조체로 정의해 두어서 관리를 하는데 아래와 같이 함수포인터가 두개나 있기 때문에 충분히 활용할 가능성이 보인다.





중요한 것은 function1은 print_description, function2는 print_fresship이라는 함수를 대입하여서 사용하는데,

add_new_book() 함수에서 type 필드를 1로 설정하면 function2를 초기화 시키지 않는다.





그리고 Mod_description을 보면 구조체내의 description은 300인데 3000정도를 받는것을 볼 수 있다.

물론 복사를 하면서 300바이트만 넣어주긴 하지만 나머지 2700바이트정도는 스택에 그대로 남아있는 것을 알 수 있다.




이 남아있는 값들을 이용해서 function2에 넣는다면 우리는 flag를 얻을 수 있을것이다.

이것을 기반으로 많은 풀이에서는 STACK SPRAY라는 표현을 쓴다. Heap Spray라는 기법과 비슷해서 그런거 같다.


프로그램 내에는 File_read함수가 있다. 이 함수의 주소를 스택에 뿌려놓으면 될거같지만 PIE가 걸려있기 때문에 불가능하다.

Memory Leak을 통해 Base 주소를 얻어와서 함수의 주소를 구할 수 있다. (Stock, Price멤버를 4바이트 꽉채우면 그 다음 멤버인 function1이 릭된다.)




Price와 Stock을 각각 0x12345678, 0x44444444로 설정해두고 나면 메뉴4번에 있는 리스트 출력으로 릭할 수 있다.



0x44444444, 0x12345678다음으로 function1에 해당하는 0xb77c89ad이다. 이값은 print_desc함수의 주소이며 base주소는 저기서 

print_desc함수의 값만큼 뺀 값이 된다.


베이스 주소에 file_read함수의 주소만큼 더하면 최종적으로 file_read함수를 찾을 수 있다.




BASE ADDRESS = 0xb77c89ad - 0x9ad



File_read ADDRESS = BASE ADDRESS + 0x8db

처럼 구할 수 있다.


(function2는 구조체의 name멤버를 인자로 한다. 그렇기 때문에 이름은 key의 경로가 되어야 한다.)



마지막으로 Mod_information으로 Stack에 뿌려져 있는 File_Read함수를 function2에 넣어주고

(Mod_Information을 이용하면 된다.)

FreeShip을 1로 다시 설정해 준다음에 function2를 실행시켜 주면 된다.



















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

Plaid CTF 2014 pork  (0) 2015.10.25
Layer7 CTF 2015 Spil..Spli....SPPPPPIILL  (0) 2015.09.16
Layer7 CTF 2015 IhaveLongDariYouHaveShotDari  (0) 2015.08.30
CampCTF 2015 hacker_level exponly  (1) 2015.08.25
Inc0gnito 2015 anti-hexray exponly  (0) 2015.08.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함