본문 바로가기

분류 전체보기

unsortedbinbin_attck died.. unsortedbin_attack unsortedbin_attack died아직 모르고 있었는데 glibc > 2.28부터는 unsortedbin의 binning code checks가 생겼다.. 이것 때문에 정말 삽질을 많이해서 안까먹게 블로그에 올린다. --- a/malloc/malloc.c+++ b/malloc/malloc.c@@ -3716,11 +3716,22 @@ _int_malloc (mstate av, size_t bytes) while ((victim = unsorted_chunks (av)->bk) != unsorted_chunks (av)) { bck = victim->bk;- if (__builtin_expect (chunksize_nomask (victim) av->system_me.. 더보기
2019 hitcon trick_or_treat trick_or_treat hitcon 2019 trick_or_treat굉장히 간단한 프로그램이다. 맨 처음에 입력받은 Size로 malloc을 해주고, 2번의 arbitrary write를 제공해준다. 여기서, chunk의 주소를 출력해주니 mmap으로 chunk를 할당받아서 libc를 leak할 수 있다. 그 후, __free_hook을 system으로 덮고, system("ed")를 실행시켜주면 된다. scanf에 큰 입력을 주면 malloc 후 입력을 chunk에 담고 free시키는데, 예를 들어 "A"를 0x500개, ed를 넣으면 chunk는 다음과 같은 형태를 갖는다. free 코드는 vfscanf의 errout LABEL이다. errout: /* Unlock stream. */ UNLOC.. 더보기
2019 codegate maris_shop maris_shop codegate 2019 maris_shop파일포인터에 익숙해질겸 다시 풀어본 문제다. 메뉴로 구성되어있는 heap 문제로 보인다. add를 하면 item과 amount를 입력받고 우리의 chunk를 하나 만들어주는데 다음과 같은 형태이다. xxxxxxxxxx00000000 struc_1 struc ; (sizeof=0x20, mappedto_6)00000000 item_price dq ?00000008 item_amount dq ?00000010 item_name dq 4 dup(?)00000030 struc_1 ends(item_name이 아무리 길어도 4바이트를 안넘으므로 그냥 이렇게 정의했다. 실제론 0x80바이트) 일단 add에서 cart_chunk를 17번째 인덱스까지 입력.. 더보기
2019 hack.lu no_risc_no_future no_risc_no_future hack.lu 2019 no_risc_no_future요 문제는 출제자가 친절하게도 docker와 qemu-mipsel-static을 제공해준다..게다가 README.md에 어떻게 실행시키고, 디버깅하는지 설명까지 되어있다.본격적으로 프로그램을 분석해보자.input을 그대로 출력해주는 심플한 프로그램이다. x LAB_00400614 XREF[1]: 00400668(j) 00400614 1c 00 c2 27 addiu v0,s8,0x1c 00400618 00 01 06 24 li a2,0x100 0040061c 25 28 40 00 or a1,v0,zero 00400620 25 20 00 00 or a0,zero,zero 00400624 94 80 82 8f lw v0,-0.. 더보기
2019 hack.lu tcalc TCalc hack.lu 2019 TCalc숫자를 입력하고, 평균을 출력하며, 숫자를 삭제하는 3가지 메뉴가 존재한다. 이 문제의 특이한 점은 2.30 glibc를 이용했다는 점과, code를 제공했다는 점이다. code 리뷰를 진행해보면, 취약점을 찾기가 힘든데, ida로 보면 다음 코드가 아래와 같이 바뀌어 있다.어떻게 이런 일이 가능한 것일까?이는 S1R1US https://www.s1r1us.ninja/2019/10/hacklu-ctf-2019-writeups.html#tcalc를 참고하였다.c style languager에서는 0 더보기
2018 hctf babyprintf_ver2 baby_printf_ver2 hctf 2018 babyprintf_ver2시작하자마자 pie를 준다. 구체적인 동작을 분석해보자.buf에 512까지 입력받을 수 있으며, 이는 bss 영역에 존재하는 stdout _IO_FILE_plus 구조체를 덮을 수 있다.밑에서는 vtable을 검사하여 변조되었는지 확인하고 변조되었다면 원래의 vtable로 복구한다.하지만 vtable이 변조되어도 abort 루틴이 없다는 것을 명심하자. __printf_chk에서 format string이 일어나지만, 릭은 불가능하다. 이유는 많다..일단 chk기 때문에 포맷 스트링 관련 문자열이 제한되어 있다. 올바른 stdout 구조체를 만들어주지 않으면 프로그램이 안돌아가기 때문이고, 또 제작자가 0xdeadbeef를 엄청 .. 더보기
linux file structure attack 보호되어 있는 글입니다. 더보기
2019 seccon monoid_operator monoid_operator seccon 2019 monoid_operator시작하자마자 어떤 연산을 원하냐고 물어본다.먼저 분석을 진행해보자. operator를 입력받는다. 리턴 값을 검사하여 오류를 발견하면 _exit(1)를 호출한다.operator를 입력받은 뒤 분기한다. +, ^, *가 있는데 난 +만 분석을 진행했다. 사용자에게 operator를 입력받고, 피연산자들을 입력받는데 이는 heap 메모리에서 관리된다.해당 주소는 ptr 변수가 가지고 있으며 이를 참조하여 v17에 값을 더해간다. 만약 __CFADD__의 결과로 1이 리턴되면 이를 감지하여 fwrite 후, free를 진행한다.여기서, __CFADD__란 CARRY_FLAG_ADD로 봐도 무방하다. 즉, 올림수를 리턴값으로 받는다. .. 더보기