본문 바로가기

보안/DreamHack

Dreamhack hook

PIE만 적용되지 않고 나머지 보호기법은 다 적용된 바이너리이다. 

 

c 코드를 살펴보면 free를 2번 하기에 밑에 있는 system("/bin/sh") 코드가 실행되기 전에 segmentation fault가 발생한다. 따라서 첫번째 free 함수가 호출이 될 때 system함수로 쉘을 따야 한다.

 

코드를 살펴보면 stdout의 주소를 알려줌으로써 libc base address를 알 수 있고, 크기를 입력받아 8byte짜리 *ptr 변수에 메모리 동적 할당을 해준다. 이후 그 할당된 메모리에 크기만큼 입력을 받고 

해당 코드를 실행 한 후에 free함수를 호출하여 ptr에 할당된 메모리를 정리한다. 

 

그럼 해당 코드는 무엇을 의미하냐, 우선 read함수를 통해 ptr을 입력받을 때 ptr의 크기인 8바이트만큼이 아니라 16바이트만큼 입력을 받으면 ptr[0], ptr[1]처럼 배열같은 구조를 갖게 되는데 이때 ptr[0]의 값을 참조한 것에 ptr[1]을 대입하겠다는 것이다. 따라서 이를 통해 ptr[0]에 free_hook의 주소를 넣고, ptr[1]에 실행시키고 싶은 함수의 주소를 넣으면 free를 할 때 free_hook이 가리키는 함수가 실행이 되는데 결국 ptr[1]에 있는 주소를 참조하여 다른 함수를 실행시키게 되는 것이다.

 

따라서 ptr[0]에는 free_hook의 주소, ptr[1]에는 main함수의 system("/bin/sh")함수의 주소를 넣으면 free함수가 호출이 될 때  system("/bin/sh")함수가 호출이 될 것이다.

 

payload는 다음과 같고 main함수의 system 주소는 gdb를 통해 알 수 있다.(no PIE)

 

실행시키면 잘 작동한다.

 

 

'보안 > DreamHack' 카테고리의 다른 글

Dreamhack Format String Bug  (0) 2024.12.04
Dreamhack out of bound  (0) 2024.10.30
Dreamhack oneshot  (0) 2024.10.18
Dreamhack fho  (0) 2024.10.14
Dreamhack basic_rop_x86  (0) 2024.10.11