티스토리 뷰

CTF

SECUINSIDE 2017 - ruma

Eyebrowmoon 2017. 7. 2. 21:55

CTF에서 first solve 땄던 문제


목표는 cheat 메뉴에서 power overwhelming을 입력하면 system(cmd)를 실행해 주는 부분이다. 다만 이 cmd는 전역에 박혀있고 정상적으로는 세팅할 방법이 없다.


처음 시도한 방법으로는 유저를 바꾸면서 아이템 개수를 초기화해주지 않는 것을 이용한 버그이다. 이를 이용해 몬스터를 만들면서 cmd 주소로 heap spray를 해두면 item linked list를 실제 아이템 개수보다 더 많이 따라가게 되면서 heap spray 해둔 값까지 따라가게 될 것이라 생각하였다. 


그러나 heap spray를 하기 위해서는 monster를 할당했다 free하는 과정이 필요했고, 이 chunk가 unsorted bin에 들어가게 된다. 그리고 이후의 chunk들을 이 chunk에서 떼어서 가져오게 되는데, 가져오기 전에 이 chunk의 내용 부분에는 fd, bk, NULL, NULL이 차례대로 박히게 된다. 즉, 우리가 아무리 heap spray를 해 두더라도 chunk를 가져오기 직전에 NULL 값이 다시 박히게 된다는 소리다.


그래서 item chunk 사이즈와 같은 다른 fastbin chunk를 찾아봤지만 아무리 찾아봐도 그 중에서 사용한 후 free하는 것은 찾을 수가 없었다.


다만 이를 찾는 과정에서 player 정보를 저장하는 struct와 cheat를 입력하는 buffer가 같은 크기를 할당받는다는 것을 알아냈고, 이와 bss 영역의 초기값은 0이라는 것을 이용하여 다른 풀이를 찾아냈다. 


아이템을 10개 초과로 들고 있을 때 cheat 메뉴에서 game over man을 입력하면 player struct가 해제된다. 이후 cheat command를 새로 입력하면 player struct 위치에 할당이 되고, 이를 이용하여 player struct를 덮어쓸 수 있다.


그 중 0x8 위치에 있는 값을 cmd 위치로 덮어쓴 후 아이템을 새로 구매하게 되면 현재 cmd pointer의 값은 NULL이기 때문에 아이템이 하나도 없는 것으로 취급하여 새로운 item struct를 할당하고, 그 struct의 0번째 칸에 우리가 선택한 아이템의 번호를 넣는다. 이 번호를 0x6873 (sh)로 선택하게 되면 결국 cmd가 sh라는 string을 가리키는 모양이 되거, 이 상황에서 cheat 메뉴로 돌아가 power overwhelming을 입력하여 쉘을 얻어낼 수 있었다.


https://github.com/Eyebrowmoon/ctf/blob/master/secuinside2017/ruma/solver.py

'CTF' 카테고리의 다른 글

SCTF 2017 Final - report  (1) 2017.08.24
SECUINSIDE 2017 - ohce  (0) 2017.07.02
SECUINSIDE 2017 - babyheap  (0) 2017.07.02
DEFCON 2017 Quals - faggin  (1) 2017.07.02
Christmas CTF 2016 - Nature Dream  (0) 2016.12.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함