본문 바로가기

system/writeup

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로 봐도 무방하다. 즉, 올림수를 리턴값으로 받는다. (cf flag 셋팅)

그 후, LABEL_2로 돌아간다.

 

overflow가 나지 않았을 경우, 정답을 출력해주며 ptrfree 시킨다.

 

연산이 모두 끝난 후, namefeedback을 입력받는데, feedback을 입력받고 sprintf를 하는 과정에서 포맷 스트링이 터진다.

이를 이용하여 stack overflow를 일으킬 수 있겠다!

 

바이너리에 pie가 걸려 있어 leak을 진행해야 하는데 잘 보이지 않는다.

정상적인 operating 흐름은 다음과 같다.

이를 통해 unsorted chunkfree하여 libc를 릭하고자 했지만 불가능했다.

top chunk와 병합하기 때문이다.

 

이를 우회할 수 있다.

여기서 fwrite의 동작을 유심히 보면, fwrite는 출력한 값을 heap에 할당한다.

이를 통해 unsorted chunktop chunk와 병합시키지 않을 수 있다.

위와 같은 식이다 ㅎㅎ

 

이를 통해 main_arena를 만들고 leak하면 된다.

그 뒤 ld.solibc를 이용해서 cookie_ptr을 계산하여 oneshot 으로 ret을 덮으면 된다.

(물론 format string stack overflow로 ^^..)

 

 

ref

LCBC @ https://ctftime.org/writeup/16992


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

2019 hack.lu tcalc  (0) 2019.11.01
2018 hctf babyprintf_ver2  (0) 2019.10.29
holyshield 2019 masked_calculator  (0) 2019.10.27
dvp 2019 monica's bank + dvp 해킹대회&컨퍼런스 후기  (0) 2019.10.22
root-me mips stack buffer overflow  (0) 2019.08.12