본문 바로가기

system/writeup

2018 hctf babyprintf_ver2

baby_printf_ver2

hctf 2018 babyprintf_ver2

시작하자마자 pie를 준다.

 

구체적인 동작을 분석해보자.

buf512까지 입력받을 수 있으며, 이는 bss 영역에 존재하는 stdout _IO_FILE_plus 구조체를 덮을 수 있다.

밑에서는 vtable을 검사하여 변조되었는지 확인하고 변조되었다면 원래의 vtable로 복구한다.

하지만 vtable이 변조되어도 abort 루틴이 없다는 것을 명심하자.

 

__printf_chk에서 format string이 일어나지만, 릭은 불가능하다. 이유는 많다..

일단 chk기 때문에 포맷 스트링 관련 문자열이 제한되어 있다.

 

올바른 stdout 구조체를 만들어주지 않으면 프로그램이 안돌아가기 때문이고, 또 제작자가 0xdeadbeef를 엄청 넣어놔서 0x10의 크기만큼 릭을 한다고 해도 볼 수 있는건 없다..

 

 

즉, fake stdout structure를 만들어 leakwrite를 모두 진행하면 된다.

 

leak은 별로 말할게 없고.. write에 관해서 설명해보겠다.

printf가 실행되는 과정은 printf_chk -> vprintf -> _IO_new_file_xsputn 이다.

_IO_new_file_xsputn을 살펴 보자.

 

밑에서 __mempcpy(f->_IO_write_ptr, s, count)를 실행시킴을 볼 수 있다.

조건은, (f -> flags & _IO_LINE_BUF) && (f -> flags & _IO_CURRENTLY_PUTTING)가 충족되지 않으면 된다.

그러면 f->_IO_write_ptr_IO_write_end - f->_IO_write_ptr만큼 복사를 진행한다.

 

이를 이용하여 __malloc_hookoneshot으로 덮고, printf_chkmalloc을 실행시키면 된다.

 

이들을 구현한 코드는 다음과 같다.

 

ref

OpenToAll @ https://ctftime.org/writeup/12124


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

2019 hack.lu no_risc_no_future  (0) 2019.11.03
2019 hack.lu tcalc  (0) 2019.11.01
2019 seccon monoid_operator  (0) 2019.10.27
holyshield 2019 masked_calculator  (0) 2019.10.27
dvp 2019 monica's bank + dvp 해킹대회&컨퍼런스 후기  (0) 2019.10.22