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()..
read()에서 오버플로우가 일어난다는 것을 알 수 있다. 하지만 딱 ret부분까지만 덮이게 된다. 그래서 stack pivoting 이라는 것을 이용해서 bss 영역에 rop 코드를 써놓고 ret부분에 leave_ret 가젯을 씀으로서 rbp와 rsp를 우리의 ROP코드가 쓰여져있는 부분으로 이동시키면 ROP코드를 실행시킬 수 있다. 그 뒤에는 one_gadget으로 쉘을 따면 된다. from pwn import * p = process('./pivot') #p = remote('pwnable.shop', 20206) e = ELF('./pivot') l = e.libc context.log_level = "debug" p_rdi_r = 0x00000000004007d3 p_rdi_r15_r = 0x0..
printf부분에서 format string bug가 터지는 것을 알 수 있다. 그런데 여기서 우리는 sfp부분 전까지만 덮을 수 있다. 그리고 checksec을 통해 알아본 결과 카나리가 있다는 것을 알 수 있었다. 그런데 카나리가 침범당하면 __stack_chk_fail()함수를 호출하게 된다. 이것의 got 부분을 우리가 원하는 함수로 덮고, stack smashing을 일으키면 함수를 실행시킬 수 있다. 그래서, hackingcamp2019에서 나온 문제인 stack pivoting으로 인해 단련된 스택 관련 경험으로 pop을 4번하게 되면 우리의 버퍼쪽으로 온다는 것을 gdb를 통해 알아내었다. 그래서 ppppr 가젯을 덮고, ROP코드를 이용해 libc leak을 하고, one_gadget 주..
heap 풍수라는 것을 이용해서 저 부분 사이에 청크를 있게 해서 익스를 하면 된다. 저걸로 free@got를 알아내 system주소로 바꾸고, free 함수의 인자로 /bin/sh를 힙을 이용해주면 된다. from pwn import * #p = process('./fengshui') p = remote('ctf.j0n9hyun.xyz', 3028) e = ELF('./fengshui') l = ELF('./libc.so.6') context.log_level="debug" def add(size,name,text_length,text): p.sendlineafter("Choice: ", '0') p.sendlineafter('Size of description: ',str(int(size))) p.s..