HanJeouk의 개인공부 블로그

2017 Codegate messenger

CTF2018. 1. 6. 13:53

메인함수를 보면 이렇게 돼있다.

MESSENGER 는 그냥 시작할 때 간지나게 messenger라고 출력하는 함수다.

우선 Leave 함수를 보면

이렇게 돼있다. custom_malloc 라고 적은 이유는 이 문제 역시 ezhp 처럼 custom_malloc 로 할당을 해준다.

그리고 free를 안했는데 fd와 bk도 나온다.

다시 leave 함수를 보면 사이즈를 32까지만 할당할 수 있고 최대 2개까지라고 나온다.


근데 change 함수를 보면

자신이 원하는 사이즈 만큼 data를 다시 집어넣을 수 있다.

이 말은 즉 overflow 가 가능하다.

시나리오가 ezhp랑 거의 판박이다.

overflow가 가능하단 걸 알게되어서 바로 공격에 들어갔다.


(Line 27 ~ 33) fastbin 2개를 할당하고 아까 말했던 취약점이 있는 change 함수를 이용하여 힙을 릭한다. 

leave만 해도 fd와 bk가 나타는 것을 이용하여 첫 번째 청크를 overflow 시켜 두 번째 청크의 prev_size와 size를 덮고

첫 번째 청크의 데이터를 출력시킨다. 그럼 null을 만날 때까지 출력을 하기 때문에 fd를 릭할 수 있다.

거기에 일정한 사이즈를 빼주면 heap 주소를 구할 수 있다.

(Line 37 ~ 39) "b"를 두 번째 청크의 prev_size 전까지 덮는다. 그 다음에 unlink를 위해 두 번째 청크의 prev_size와 size를 -1 로 바꾼다.

그리고 fd에 nop(\x90)와 shellcode가 들어갈 주소를 넣는다 bk에는 exit_got-8을 넣는다. (gdb로 unlink를 계속 시키면서 보면 exit_got-8을 해야 unlink 될 때 exit_got에 fd가 들어가는 걸 알 수 있다.) 

그리고 nop과 shellcode를 넣어준다.

remove(1)를 이용하여 두 번째 청크를 unlink 시킨다.

하지만 Line 39까지만 한다면 쉘이 안따질 것이다. 왜냐하면 remove 함수 때문에 nop 중간에 bk 주소가 들어가기 때문이다.

그래서 나는 change를 이용하여 그 bk를 덮어버리기로 했다.

그게 바로 Line 41이다. bk를 덮을 때 다른 건 전부 똑같이 맞춰주면 된다.

쉘 코드를 처음에 이상한 걸 써서 오지게 삽질을 했다.

시나리오가 ezhp와 똑같아서 분석 실력에는 엄청 도움되지는 않았지만

gdb를 조금 더 능숙하게 사용하게 된 것 같아서 엄청 재미있었고 혼자 풀어서 뿌듯하다 ㅎ.





'CTF' 카테고리의 다른 글

2016 Hitcon sleepy holder  (0) 2018.01.21
2016 Hitcon secret holder  (0) 2018.01.21
2014 Plaid CTF Ezhp  (0) 2018.01.04
tuCTF guest_book  (2) 2017.12.03
tuCTF vuln-chat2  (0) 2017.11.29