main 함수 부분입니다. 전형적인 힙문제입니다. setup에서는 버퍼링과 환영 메시지를 띄어주게 됩니다. 그 다음에는 이 코드들이 실행되는데 1. 0x100, 0x10크기 할당 2. 0x100 free -> 0x100 크기 청크는 unsorted bin에 들어감 3. backup에 unsorted bin에 들어가 있는 청크의 fd, 즉 main_arena + 88의 주소값을 저장 4. 0x10 청크를 free -> fastbin에 이 0x10 크기 청크가 들어감. 5. 0x200 청크를 할당 & 해제 -> free 함수 내부에서 1번에서 할당한 2개의 청크가 모두 병합됨. 즉 저 코드는 backup에 main_arena + 88의 주소를 저장하기 위한 과정입니다. 0번째 메뉴 Clean입니다. back..
1. malloc_consolidate()와 double free bug를 이용해 fastbin과 smallbin에 같은 청크가 2번 있게한다. 2. fastbin에 있는거 받아서 안에 fake chunk를 구성하되 다음 청크의 prev_size를 0x20으로 변경 3. 2번에서 받은 청크의 다음 청크를 free -> unlink 호출(prev_inuse가 셋팅안됨) 4. 3번의 unsafe unlink로 bss 영역을 수정할 수 있으므로, big, huge chunk ptr의 값을 수정 -> libc leak, one_gadget 이용
이것도 ezshell 문제와 같이 쉘코딩 문제이다. 8바이트만 입력을 받는데 여기서 sandbox()는 세컴으로 execve, execveat 등을 막는다. 즉 쉘을 따는것이 불가능함로 ORW를 해야 한다. 하지만 8바이트만으로는 부족하므로, 8바이트 쉘코드로 read함수를 호출하도록 하여 입력을 많이 받으면 된다. ORW를 할 때 파일 이름을 모른다면 getdents 또는 getdents64 syscall을 이용하면 쉽게 알아낼 수 있다.
https://github.com/balexios/glibc2.23/blob/master/stdlib/exit.c balexios/glibc2.23 glibc version 2.23. Contribute to balexios/glibc2.23 development by creating an account on GitHub. github.com read를 실행한뒤의 레지스터를 활용해 libc leak, stack leak 까지 할 수 있다. 그래서 i의 값을 음수로 바꾸려 했지만 잘 안되서 포맷 스트링 버그를 할 때마다 0으로 바꾸어주면서 여러번 fsb를 할 수 있도록 했다. 그래서 libc leak 후 __free_hook을 one_gadget으로 덮어 둘 수 있다. 이 exit 함수의 cur->idx를..