본문 바로가기

system/writeup

nullcon hackim 2019 tudutudututu

tudutudututu

nullcon hackim 2019 tudutudututu

일단 todo의 구조는 위와 같다.

 

처음 만들 때 name의 공간을 strdup으로 할당하며

나중에 desc를 쓸 때 malloc으로 desc의 공간을 할당한다.

 

desc를 쓰는 함수의 윗부분이다.

처음에 이미 할당한 desc가 존재하면 free를 시킨다.

 

근데 여기서 length0xFF 이상이라면 "Too big!"을 출력하고 return한다.

원래 루틴이라면 freemalloc을 하여 다시 todo + 8에 저장시켜줘야 하지만 length0xFF 이상이라면 그러지 않는다.

dangling pointer 상황이 발생한다.

 

이를 이용하여 모든 exploit을 진행할 수 있다.

 

print_todo 함수에서 name과 desc를 출력해 준다.

즉, desc를 unsortedbin으로 free시키면 main_arena+88의 주소를 leak할 수 있다.

 

또, delete 함수에서는 todo, name, desc 세 개를 free 시켜준다. 이를 이용하여 fastbin dup을 일으키면 정말 귀찮을 것 같아서 desc 함수의 dangling pointer를 이용하여 fastbin dup chain을 만들었다.

 

위와 같이 0x20fastbin을 제외하고 깔끔하게!

 

그래서 여차저차 leak을 하고 fastbin dup을 통해 malloc_hookoneshot으로 바꿔 exploit을 해보면 서버의 libc로 쉘이 따이지 않는다.

 

때문에 oneshot가젯을 사용하지 않고 fastbin dup을 두 번 트리거한 후 stackleak하여 스택 근처 0x40의 값이 있는 곳(canary와 ret 사이)으로 할당을 받아 RTL로 풀었다.

 

깔끔하게 익스 진행하려고 많이 노력했는데 중간중간에 bin이 계속 꼬여서 삽질을 정말 많이 했네요..

 


'system > writeup' 카테고리의 다른 글

2014 31c3 mynx  (0) 2019.02.04
nullcon hackim 2019 easy-shell  (0) 2019.02.03
nullcon hackim 2019 babypwn  (0) 2019.02.03
nullcon hackim 2019 hackim shop  (2) 2019.02.03
2016 bctf memo  (0) 2019.02.02