CTF에서 first solve 땄던 문제 목표는 cheat 메뉴에서 power overwhelming을 입력하면 system(cmd)를 실행해 주는 부분이다. 다만 이 cmd는 전역에 박혀있고 정상적으로는 세팅할 방법이 없다. 처음 시도한 방법으로는 유저를 바꾸면서 아이템 개수를 초기화해주지 않는 것을 이용한 버그이다. 이를 이용해 몬스터를 만들면서 cmd 주소로 heap spray를 해두면 item linked list를 실제 아이템 개수보다 더 많이 따라가게 되면서 heap spray 해둔 값까지 따라가게 될 것이라 생각하였다. 그러나 heap spray를 하기 위해서는 monster를 할당했다 free하는 과정이 필요했고, 이 chunk가 unsorted bin에 들어가게 된다. 그리고 이후의 c..
입력을 받을 때 buffer 크기를 0x20단위로 올림하여 그 크기만큼의 스택 공간을 확보한다. 그런데 이 때 입력을 다 받고 NULL 문자를 박아주지 않기 때문에 strlen 함수를 호출하면 뒤의 stack frame pointer까지 센다. 이를 이용해 echo 함수에서 우선 stack leak을 얻을 수 있다. 다시 echo rev 함수에서 이를 이용하여 rsp를 조작하고, 이를 이용하여 ret instruction이 실행될 때 shellcode로 뛸 수 있도록 세팅해둔다. (세팅은 echo나 메뉴 고를 때 입력을 엄청 길게 넣어서 해두면 된다) https://github.com/Eyebrowmoon/ctf/blob/master/secuinside2017/ohce/solver.py
team member를 음수로 넣을 수 있는데, 이를 이용하면 realloc(buf, 0)을 호출하여 버퍼를 free시킬 수 있다. 바이너리에서 이 경우를 따로 처리해주지 않기 때문에 이를 이용한 uaf를 통해 member pointer가 free_hook을 가리키도록 하여 수정할 수 있다. libc leak은 그냥 unsorted bin - 0x10 leak 나는걸로 해결 https://github.com/Eyebrowmoon/ctf/blob/master/secuinside2017/babyheap/solver.py
처음 바이너리를 실행하고 10개의 메뉴에 당황했지만 풀어보니 나름 재밌었던 문제. 취약점은 위의 그림과 같이 사실 물고기를 17마리까지 구매할 수 있다는 점이다. 사실 나는 실행횟수 100회 제한 때문에 3400원 못 벌 줄 알고 이 부분 발견하고도 꽤 고민했는데 혹시 해서 실험해보니 너무 쉽게 가져서 좀 당황했다. 17번째로 구매한 물고기의 포인터는 자신이 가지고 있는 액수에 해당되는 변수를 덮어쓰는데, 이를 통해 heap memory leak을 낼 수 있음과 동시에 물고기 포인터들을 덮어쓸 수 있는 어항 이름 변경 routine으로 진입할 수 있게 된다. 이를 이용하기 위해 처음 바이너리를 시작하면 꽤 긴 값을 입력받을 수 있는 name buffer에 fake fish를 주소가 8 차이나도록 두 마리..
풀면서 설마설마 했지만 정말로 지난 HITCON 때의 House of Orange에서 다루었던 File-Stream Oriented Programming을 통한 exploit이었다. (House of Orange write up: http://4ngelboy.blogspot.kr/2016/10/hitcon-ctf-qual-2016-house-of-orange.html) 사실 위 글이 너무 설명을 잘해놔서 따로 할 말은 없는듯. 이 테크닉만 안다면 정말 간단한 문제라 생각해서 100점이 배정된 듯 한데 처음 써보는 테크닉이라 조금 힘들었다. 바이너리 및 익스플로잇 주소https://github.com/Eyebrowmoon/ctf/tree/master/christmas2016/unlink
malloc, free를 사용하는 간단한 함수들로 이루어진 전형적인 쉬운 힙 익스플로잇 문제 핵심은 overflow가 발생하는 4번 routine으로 진입할 수 있느냐이다 동일한 크기의 fastbin chunk A, B를 할당받아 free A -> free B -> free A를 통해 fastbin 내의 next 포인터를 조작할 수 있는 환경을 구성한다. 이후 GOT쪽의 주소를 size로 활용하여 House of Spirit을 통해 routine 검사에 사용되는 변수의 값을 덮어썼다. 이후는 간단히 puts를 통한 GOT leak 이후 다시 메인으로 돌아와 system으로 점프. 아래는 바이너리와 익스플로잇https://github.com/Eyebrowmoon/ctf/tree/master/christma..
지난 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개로만 계속 시도하다 도무지 방법이 보이지 않..