2014 Plaid CTF Ezhp
힙알못이라 난이도가 쉬운편인 문제들부터 서서히 풀기로 했다.
아무것도 안걸려있다ㅋㅋ.
IDA로 main 함수를 보면 이렇게 5개의 메뉴가 보인다.
Change 함수에 있는 이 부분에서 취약점이 생기는데 사이즈 조절을 안해놔서 사이즈를 마음대로 크게 정해놓고 read로 그 사이즈만큼 받아서 overflow를 일으킬 수 있다. 그래서 청크의 헤더와 fd, bk 를 조작해서 unlink 시킬 수 있다.
그래서 나는 exit 함수 got에 쉘 코드를 집어넣었다.
문제가 신기한게 할당을 하기도 전에 힙 영역을 보면 fd 와 bk가 있다 ㄷㄷ..
그래서 free를 하지 않아도 fd 와 bk가 있다.
시나리오를 설명하자면
(Line 33 ~ 41)청크 3개를 할당한 다음에 0번 청크를 1번 청크의 fd(2번 청크)까지 오버플로우 시켜고 0번을 출력시켜서
1번 청크의 fd(2번 청크) 를 구한다.
이 fd는 나중에 공격에 사용된다.
(Line 42) 0번 청크를 다시 overflow 시켜서 prev_size와 size를 -1(\xff\xff\xff\xff) 로 바꿔주고 exit_got-4 를 넣어준다.
이 문제는 custom malloc&free 라서 일반 unlink와 다르게 unlink 될 때 다르게 돼서 -8 이 아닌 -4를 해준다.
(원래 unlink는 bk+8 에 fd를 넣어줌 그래서 bk -8을 해줘야 되는데 custom이라서 bk+4 에 fd를 넣어줌 그래서 bk-4 다 그래서 exit_got에 -8이 아닌 -4를 해준다.)
위에 있는 사진이 ezhp의 unlink 부분이다.
(Line 43)chunk 2의 값을 NOP(\x90)과 shellcode로 채워준다.
그리고 익스코드에는 안적었는데 free(1)을 하고 exit함수를 실행시키면 쉘이 따진다.
왜냐하면 unlink가 되면서 exit_got가 쉘코드가 있는 청크 2의 주소를 가리켜서 exit가 실행되지 않고 쉘코드가 실행돼서
쉘이 따진다.
-의식의 흐름 끝-
문제를 풀 때 취약점을 찾고 어떤 기법으로 풀어야 될지는 알았는데 무엇을 unlink 시켜야하는지 파악을 못했다.
그래도 이 문제를 풀면서 힙 공부에 도움이 많이 된 것 같았다. :)
'CTF' 카테고리의 다른 글
2016 Hitcon secret holder (0) | 2018.01.21 |
---|---|
2017 Codegate messenger (0) | 2018.01.06 |
tuCTF guest_book (2) | 2017.12.03 |
tuCTF vuln-chat2 (0) | 2017.11.29 |
tuCTF vuln-chat (0) | 2017.11.28 |