Hack
-
Symchk로 pdb 가져오기Hack/Bughunting 2016. 12. 5. 12:40
symchk은 windbg내장되어있는 프로그램인데, 원하는 서버에서 심볼을 가져올 수 있는 엄청 좋은 유틸이다. 꿀팁주신 박세준 멘토님 감사합니다 :) 어떠한 경우에선 pdb가 필요할때가 있는데 그때 사용하면 된다. 여기에선 jscript라는 dll파일의 pdb를 가져오는것을 할것이당 아래와같이 입력해주면 된다. symchk.exe /s symchk.exe c:\WINDOWS\system32\ntoskrnl.exe /s http://msdl.microsoft.com/download/symbols 잘 받아온다면 passed + ignored files에 1이 반환된다. 그럼 windbg 경로로 가면, sym이라는 디렉터리가 생기는데 거기에 pdb가 생성된다. jscript.dll과 jscript.pdb를 ..
-
-
-
malloc large_chunk exploit scenarioHack/Pwnable 2016. 12. 2. 21:10
이것은 여전히 시나리오다! 이전에 small bin에서는 unsafe_unlink를 적용할때 fd와 bk를 P와 비교해서 corruption error를 띄우던가 했었는데 malloc코드를 계속보던중 해당 루틴을 발견했다. 이거에 대해서 문제를 하나 만들어봐야겠다. 이것역시, smallbin의 범위에서 벗어나 large chunk가 할당되고, p->fd_nextsize와 p->bk_nextsize를 비교한다. 그럼 unsafe_unlink를 할때 fd_nextsize와 bk_nextsize를 주물러주면되겠군 크크 일단 main_arena+88 들어가는곳을 맞춰줘야하는것이 문제인데, 이경우에선 unsorted bin에서의 문제이니 상관없고, 만약 이걸 노린 문제가 생긴다면 릭한후 맞춰주는 식으로 하면 간단..
-
malloc - do_check_inuse_chunk()Hack/Pwnable 2016. 12. 1. 04:31
chunk가 있는지 검증하고, 청크가 맵핑되어있으면 return 시킴. 현재 청크의 inuse가 0이면 Abort를 띄우고, 다음 청크의 포인터값을 next에 집어넣는다. 이제 여기서가 핵심인데, 아래 코드를 보자 if (!prev_inuse(p)) { mchunkptr prv = prev_chunk(p); assert(next_chunk(prv) == p); do_check_free_chunk(av, prv);} 해당 청크의 prev_inuse가 0이면 해당 분기문을 타게되는데, prv 구조체변수에 아래와 같은 값이 들어간다. #define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_size) )) 인자로받은 청크에서 prev_size값을 뺀다. 이..
-
malloc - do_check_free_chunk()Hack/Pwnable 2016. 12. 1. 04:13
do_check_free_chunk는 해당 청크가 free되있는지를 판단한다. 전 글에서 설명한 do_check_chunk로, av와 p를 검사하는데, av는 malloc_state 구조체이다. 만약 해당 청크의 prev_inuse가 1이라면 Abort를 띄우고, 맵핑되어있다면 Abort를 띄운다. 이 함수는 free되어있는지 체크하는 함수이기때문에 당연히 이래야함! 만약에 청크의 size가 MINSIZE보다 크면 첫번쨰 분기문을 타게되는데, 엄청나게 많은것을 따진다. 간단하게말하면, 다음청크의 prev_size가 현재 청크의 size인지 비교하고, 아니면 Abort를 띄운다. 그리고 prev_inuse가 0인지 1인지를 비교하고 0이면 Abort를 띄운다. 제일 중요한건 Unlink와 비슷한게 있는데,..
-
malloc - do_check_chunk()Hack/Pwnable 2016. 12. 1. 04:04
do_check_chunk는 말 그대로 chunk를 check 하는 매크로이다. 현재 Chunk의 사이즈를 sz 변수에 초기화한다. max address는 av의 top과 현재 청크의 top chunk사이즈를 더한값이 max address가 되고,min_adress는 max_address 에서 system_mem 즉, 현재 할당된 메모리 양을 뺀다. system_mem은 malloc_state 구조체 멤버로, 현재 할당된 메모리양을 추적하는데 사용된다. if 문에서 chunk_is_mmaped로 현재 청크를 인자로 받는데, #define chunk_is_mmapped(p) ((p)->size & IS_MMAPPED) 이렇게 define 되어있는것을 확인 할 수 있고, chunk의 size에서 플래그값인 ..
-
malloc - unlinkHack/Pwnable 2016. 12. 1. 02:17
123456#define unlink(P, BK, FD) { \ FD = P->fd; \ BK = P->bk; \ FD->bk = BK; \ BK->fd = FD; \}Colored by Color Scriptercs unlink는 free가 연속적으로 될때 병합시키기위해 호출되는 매크로이다. P는 현재 청크이고, 위 인스트럭션은 아래와 같이 나타난다. FD = *P + 8; BK = *P + 12; FD + 12 = BK; BK + 8 = FD; 위를 보면 FD와 BK 포인터를 조작할 수 있게되면 FD+12 위치를 BK로 덮을 수 있다는 얘기가 된다. 그래서 항상 double free bug 공격을 할 때, fd-12 위치를 넣어주는 이유도 +12가 되기때문에 fd에 제대로 작성하기위해 -12를 넣어주..