2017 Codegate messenger
메인함수를 보면 이렇게 돼있다.
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 |