문제를 ida로 디스어셈을 봤을 때 구조는 단순하다. malloc을 해주고 free를 해주게 된다. 이 문제를 익스 플로잇하는 방법은 간단하다. 1. fastbin 크기로 malloc (순서 조심) - libc leak 2. stdin _IO_buf_base 수정 3. 다시 stdin _IO_buf_base 수정 4. one_gadget 또는 system 주소 입력 첫번째로 fastbin 크기로 작은것 1개 그것보다 큰 크기로 1개를 할당한뒤 다시 한번 할당을 하면 libc leak이 이루어지게 되는데 그 이유는 malloc_consolidate라는 함수 때문이다. 코드로 나타내면 이렇게 되는데 ### libc leak malloc(24,'a' *24) malloc(50, 'a') malloc(200, ..
이 문제파일은 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를 이용해 입력을 받는다는 것..
처음에 ida를 통해 문제를 열게 되면 함수들이 sub~~어쩌구로 나오게 되는데 이것을 실행했을때 나오게 되는 선택지로 함수 이름을 복구하면 됩니다. 그래서 복구를 해보게 되면 main은 void __cdecl __noreturn main() { int v0; // eax char buf; // [esp+8h] [ebp-10h] unsigned int v2; // [esp+Ch] [ebp-Ch] v2 = __readgsdword(0x14u); setvbuf(stdout, 0, 2, 0); setvbuf(stdin, 0, 2, 0); while ( 1 ) { while ( 1 ) { intro(); read(0, &buf, 4u); v0 = atoi(&buf); if ( v0 != 2 ) break; de..
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번해야 된..
전형적인 힙 메뉴이다. malloc메뉴이다. malloc가능한 갯수가 6개로 한정되어있다. free를 할때 배열을 초기화시키지 않음으로서 취약점이 발생한다, show부부인다. 저기 if조건문이 자세히 보면 &&인 것을 볼 수 있다. 즉 oob가 발생하게된다. 익스 방법 1. fastbin크기의 청크 2개 할당(내용에 함수의 got주소도 같이 박아둔다.) 2. fastbin을 double free 함 3. 2번 과정에서 알아낼 수 있는 청크의 주소를 알아내서 oob를 통해 1번에서 박아둔 got주소를 출력해줌으로서 libc를 leak한다. 4, 다시 한번 malloc을 통해 fastbin에 들어가있는 청크를 가져온다. 그리고 그 청크의 fd에 malloc_hook 이전의 fastbin에 맞는 chunk의 ..
전형적인 힙 문제 힙 크기를 고려해 할당해주고 있다. free할 때 초기화를 하지 않음으로서 취약점이 발생한다. modifyfmf 통해 free된 청크를 수정함으로서 취약점이 발생한다. admin 체크를 해서 성공하면 rop를 할 수 있다. 이 함수를 이용하면 쉘을 딸 수 있다. 익스 구상 1. unsorted bin에 들어갈 청크 크기만큼 힙 2개 할당 2. 첫번째 청크를 해제하고, 그 청크의 bk를 덮어쓸 주소(admin) - 16로 저장 3. 다시 할당 그러면 admin에 main_arena + 88이 저장됨 4. 4번 메뉴 선택 -> binsh 함수 실행시켜 쉘을 딴다 from pwn import * context.log_level= 'debug' def add(size, data): p.send..
from pwn import * #p = process('./campnote') p = remote("pwnable.shop", 20202) e = ELF('./campnote') l = e.libc context.log_level="debug" def malloc(size, content): p.sendlineafter('>>','1') p.sendlineafter('size >> ',str(size)) p.sendlineafter('data >> ',str(content)) def free(index): p.sendlineafter('>>','2') p.sendlineafter('index >> ', str(index)) def show(index): p.sendlineafter('>>','3') p..
전형적인 메뉴를 이용하는 힙문제다. 최대 19번까지 힙을 할당할 수 있고, heap_context배열안에 포인터를 저장한다. oob를 막아났지만, free뒤에 heap_context배열을 초기화시키지 않아서 취약점이 발생한다. free된 힙부분을 볼 수 있어서, 취약점이 생긴다. 1. fastbin에 들어갈 청크 2개 생성 2.unsorted bin에 들어갈만큼의 힙 할당후 해제 3. view로 보아서 libc leak 4.double free bug를 활용해서 fastbin에 들어갈 chunk를 free시킨다. 5. malloc()으로 free한 fastbin에 있던거 1개 할당받고, fd를 malloc_hook부분을 fastbin에 들어갈 크기로 할당할 크기를 잘 맞춰 수정한다. 6. malloc()..