이것도 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를..
정훈이형의 도움으로 문제를 풀게 되었다. 시험기간이여서 간단히 정리를 하자면 1. 청크내 가짜 청크를 만들고 아다리를 맞춘다. 2. free된 fastbin 크기의 청크에서 size필드를 수정하고 free를 함으로서 fd에 libc 주소를 적는다. 3. 적혀진 libc 주소 + 0.5바이트 브루트 포싱을 이용하여 stdout 구조체 근처에 할당& 수정(libc leak) 4. 3번에서 leak한 값을 바탕으로 __malloc_hook을 one_gadget으로 덮는다.
이 문제파일은 strip되어 함수 심볼같은 것들이 다 날라가 있다. 그래서 실행했을 때의 모습과 문자열을 통해 함수들을 복구해내어야 한다. 그런데 ida의 디컴파일 기능으로도 제대로 복구가 안되기 때문에 어셈블리어도 함께 보아야한다. 이렇게 어셈블리어로 보면 보다 정확하게 어떤 함수가 어떤 인자로 호출되는지 알 수 있다. 1. fp = fopen("top_secret", "r"); 파일을 열고 그 파일 디스크립터를 bss에 있는 변수에 저장해둔다. 2. scanf("%s", &scanf_buffer); 를 실행하는데 저 scanf_buffer는 bss의 주소에 있다. 즉 우리는 bss에서 bof를 일으킬 수 있는 것이다. 3. read(fp, buffer, 0x12c); fp를 이용해 입력을 받는다는 것..
printf부분에서 formatstring bug가 발생한다는 것을 알 수 있다. 이 문제를 푸는 방법은 babyfsb문제 처럼 rsp를 건드리지 않고 pop 을 여러번 하는 가젯을 통해 스택에 적어놓은 ROP코드를 실행하면 된다. 2019/08/25 - [CTF write-up] - [hackctf] babyfsb [hackctf] babyfsb printf부분에서 format string bug가 터지는 것을 알 수 있다. 그런데 여기서 우리는 sfp부분 전까지만 덮을 수 있다. 그리고 checksec을 통해 알아본 결과 카나리가 있다는 것을 알 수 있었다. 그런데 카나리가.. youngsouk-hack.tistory.com 다만 여기서는 스택에 적을 수 있는 갯수가 너무 적어서 pop을 6번해야 된..