티스토리 뷰
Category: Pwnable Points: 400 Solves: TODO Description:
- Binary : http://binary.grayhash.com/7692931e710c1d805224c44ab97ddd52/bookstore
- Server : 54.65.201.110
- Port : TCP 31337
- Flag Path : /home/bookstore/key
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 |