HanJeouk의 개인공부 블로그

2014 Plaid CTF Ezhp

CTF2018. 1. 4. 19:34

힙알못이라 난이도가 쉬운편인 문제들부터 서서히 풀기로 했다.

아무것도 안걸려있다ㅋㅋ.

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