본문 바로가기

system/material

c++ std::string c++ stdstring c++ std::string 클래스에 대해 정리해보려 한다.이걸 공부하게 된 계기는 std::__cxx11::basic_string::basic_string(v1)위와 같은 mangling된 c++ 함수를 분석하고자였다. 위 구문은 스택 오버플로우에서 std::string(v1)과 동일하다고 말하고 있다. 이 string 클래스는 우리가 일반적으로 문자열을 다룰 때 사용하는 char와는 차이가 있다. char형 배열, char형 포인터로 문자열을 다룰 때 char형 배열은 esp를 늘려 쭉 입력하는 형태이고 char형 포인터는 해당 주소에 문자열 주소를 가지고 있는 형태이다. string 클래스로 문자열을 다뤄보기 전에 구현부를 보고 가자. xxxxxxxxxxclass strin.. 더보기
fastbin dup consolidate 정리 fastbin_dup_consolidate 정리 이번에 hitcon 문제를 풀면서 이 기법을 사용해봤는데 헷갈리는 점이 많았어서 정리한다. 이 기법을 설명하기 이전에 병합이 언제 일어나는지 알아야 한다.내가 여태까지 알기로는 병합은 두 경우에서 일어난다. inuse_bit flag가 존재하지 않는 chunk를 free했을 때 prev chunk와 consolidatelarge bin range chunk를 할당했을 때 fastbin chunk와 인접해 있는 경우 fastbin dup consolidate는 large bin range chunk를 할당했을 때 fastbin chunk와 인접해있지 않은 경우 fastbin chunk를 smallbin chunk로 이동시키는 것을 이용한 기법이다. xxxxx.. 더보기
x86, x64 srop 정리 srop x86, x64 srop 기법을 정리한다.srop는 sigreturn return oriented programming으로, sigreturn system call을 사용하는 rop이다. 이 기법은 rop를 하기 위한 gadget이 부족할 때 요긴하게 사용할 수 있다. 이 기법을 이해하기 위해서는 user mode와 kernel mode에 대해 알아야 한다. 프로그램은 보안, 자원 관리 등의 이유로 user mode와 kernel mode를 왔다갔다 하면서 실행된다.user mode는 접근할 수 있는 영역이 한정적이며, kernel mode는 모든 자원에 접근할 수 있다. 아직 제대로 공부한 적이 없어서 정확히 어느 부분이 한정적인지는 모르겠다. 보통 kernel mode에서는 signal을 처.. 더보기
glibc 2.26 tcache 동작 분석 및 exploit (how2heap) tcache 이번에 코드게이트 준비하다가 우연히 tcache dup 문제를 풀게 됐는데 한글 문서가 별로 없는것 같아서 glibc 분석 내용을 정리한다. tcache(thread local caching)은 malloc과 free의 호출 횟수를 줄여 속도를 높이기 위해 고안되었다고 한다. 캐싱 작업을 통해 fastbin, unsortedbin 등등..이 불릴 일 없이 빠르게 처리하는 것 같다.. tcache 구조체xxxxxxxxxxtypedef struct tcache_entry{ struct tcache_entry *next;} tcache_entry;​/* There is one of these for each thread, which contains the per-thread cache (hence.. 더보기
got_overwrite stack_smashing_detected got_overwrite 이번에 got_overwrite를 하면서 알게 된 사실인데.got.plt 주소 간격을 보면 64비트 기준으로 8바이트씩 매우 빡빡하게 차있는 것을 볼 수 있다.여기서 만약 strcpy에 맨 뒤에 NULL byte를 포함시키는 cin과 같은 함수로 got_overwrite를 통하여 p64(0x8)을 보내면? 위와 같이 strcpy의 got는 성공적으로 overwrite됐지만 그 다음에 있는 got가 NULL로 1바이트 덮여버린다.이 경우 나는 해당 함수의 canary가 변조되어 stack_smashing_detected 오류가 발생하였다. 직접 손으로 돌려가며 찾아야 하는 부분이라 오래 걸린다.. 이를 방지하는 방법은 p64(0x8).rstrip('\x00').ljust(7,'\x.. 더보기
unsorted bin free 동작.. danglingPtr danglingPtr.cfree(qlist[1]) ( main+188 ) breakpoint qlist[1] heap status before freeqlits[1] heap status after free-> 128 (0x80) 만큼 할당한 후 free 한다면 unsortedbin으로 들어간 후 fd와 bk가 main_arena+88 영역이 되어야 할건데 그냥 사라져버린다?? test.ca (main+78) breakpoint a heap status before freea heap status after free-> unsortedbin에 들어간 후 mainarena+88 영역이 잘 들어가 있다. 즉 데이터 재사용이 불가능하다. 위 두 예제를 봤을 때 prev_size와 inus.. 더보기