티스토리 뷰

CTF

HITCON 2016 - Secret Holder

Eyebrowmoon 2016. 10. 10. 15:12

지난 HITCON 2016에서 pwn 문제들만 쭉 봤는데 문제들이 다들 너무 어려웠다 ㅜㅜ


Pwn 문제중 팀에서 푸는데 성공한건 Shelling Folder와 Secret Holder인데 Shelling Folder는 같이 하시던 분이 풀어주셨다.


바이너리 크기는 매우 작은편. 열어보면 Small, Big, Huge size의 chunk들을 하나씩 할당받아 그곳에 값을 쓸 수 있게 되어있다. 문제는 그 안에 있는 값을 읽게 해주지는 않는다.


취약점은 wipe 함수에서 free 하기 전에 아무런 check routine이 없고, free 후에도 포인터를 그대로 남겨둔다는 점이다.



다만 huge는 할당을 시도하면 따로 mmap이 되기 때문에 small, big 2개로만 계속 시도하다 도무지 방법이 보이지 않았다.


처음 시도한 방법은

keep small -> wipe small -> keep big -> wipe small -> keep small -> wipe small

순서로 fastbin chunk를 만든 뒤 이후 consolidate 되는 과정을 이용해 House of Spirit을 시도하려 했지만, 우선 size로 쓰기에 적합한 곳 자체가 잘 보이지 않았다.


아무리 생각해도 Huge pointer를 small, big과 겹치도록 만들어야 할 것 같은데 당연히 mmap되어 다른 곳에 갈 것이라 생각해서 답을 전혀 찾지 못하고 있었다.


Sleepy Holder가 공개된 이후 둘의 차이점을 보니 huge를 wipe, renew를 못하게 좀 삽질해보니 huge chunk를 wipe 했다가 다시 할당하면 top chunk size가 커져있어서 small, big과 같은 영역에 할당되었다. 맙소사;;


결국 

[                                   Huge                                         ]

[            Big                ] [ Small ]


과 같은 모양으로 겹치도록 만들었고, Small header쪽의 prev_size와 size, prev_in_use bit 등을 잘 수정해서 Small을 wipe 할 때 Big쪽에 만들어둔 fake chunk가 free 되도록 하였다. Free 되는 과정에서 전역에 있는 Big buffer를 가리키는 포인터가 자신의 주소 - 0x18을 가리키도록 하는데에 성공.


이후에는 모든 buffer pointer와 check flag를 마음대로 설정할 수 있으니 free got를 puts plt로 덮어 library 주소 leak을 냈다. Library는 다른 문제에서 사용하는 library와 같은 것 같길래 그걸 이용해서 offset을 계산해 다시 system으로 덮고 system("/bin/sh")를 부르니 성공적으로 쉘을 얻을 수 있었다.


자세한 exploit은 아래 링크로.


https://github.com/Eyebrowmoon/ctf/blob/master/hitcon2016/secret_holder/solver.py

'CTF' 카테고리의 다른 글

SECUINSIDE 2017 - babyheap  (0) 2017.07.02
DEFCON 2017 Quals - faggin  (1) 2017.07.02
Christmas CTF 2016 - Nature Dream  (0) 2016.12.25
Christmas CTF 2016 - House of Daehee  (0) 2016.12.25
Christmas CTF 2016 - Who is solo  (2) 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
글 보관함