본문 바로가기

보안/DreamHack

Dreamhack basic_exploitation_003

sprintf함수는 처음보는데 원형은 다음과 같다.

 

#include <stdio.h> 

int sprintf(char* str, const char* format, ...);

printf(format); 이 format을 화면에 출력해주는 것이라면 sprintf는 화면에 출력하는 것 대신에 형식에 맞게 str에 쓰는 거라고 보면 된다.

 

그럼 화면에 출력하는 것 대신에 특정 포인터변수가 가리키는 배열에 쓰는 것이므로 sprintf에서도 format string bug가 발생하게 되고 이를 알았다면 이전에 푼 basic_exploitation_002와 아주 유사한 문제가 된다.

 

got에 적혀있는 printf의 주소를 get_shell의 주소로 덮어버리면 된다. 

 

이때 예를 들어 0x08041234의 주소를 0x08042345로 덮는다고 가정을 했을 때 hn을 통해 2바이트씩 끊어서 덮으면 seg fault가 발생하게 된다. 왜냐하면 sprintf를 통해 stack_buf에 쓰는데 stack_buf의 크기가 0x90이기 때문이다. 따라서 hhn을 이용해 1바이트씩 끊어서 덮어야 한다.

 

따라서 payload는 다음과 같고 실행하면 shell을 얻을 수 있다.

 

해당 문제는 이전 문제와 상당히 유사하지만 printf 함수에서만 format string bug가 발생하지 않는다는 것을 보여주고 1바이트씩 쪼개서 특정 주소를 덮는 방법도 연습할 수 있었던 문제였다.

 

 

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

Dreamhack - Use After Free  (0) 2025.03.24
Dreamhack Recover  (1) 2024.12.06
Dreamhack basic_exploitation_002  (0) 2024.12.04
Dreamhack Format String Bug  (0) 2024.12.04
Dreamhack out of bound  (0) 2024.10.30