오래 못 할 짓 하지 않기

[ 워게임 ] 48. Pwnable 69 : memory_leakage 본문

보안_모의해킹/CTF (Capture The Flag)

[ 워게임 ] 48. Pwnable 69 : memory_leakage

쫑알bot 2025. 2. 16. 17:08
728x90

 

 

이건 메모리 구조를 한 번 봐야겠다.

구조체가 어떤 크기로 저장되는지 확인해보자.

 

 

v3 = idx

v5 = age

s = flag_buf[56]

buf = name[16] 으로 인식된다.

 

 

저장되는 형태를 보면 오른쪽 사진과 같다.

 

취약점은 2번 메뉴에서 %s이다.

printf("%s" , 변수)일 때는

변수에서부터 시작해서 \n 나 NULL을 만날 때까지 읽는다.

 

만약 못 만나면? ▶ 계속 읽는다.

 

 

그럼 우리는 [ buf - age - flag_buf ] 사이에 NULL이나 \n이 없게 해주면

buf ~ age ~ flag_buf 사이에 있는 '문자열' 을

printf ("%s", my_page.name) 로 뽑아올 수 있다.

 

우리가 할 건

1. buf(name)를 채우고

2. age에 NULL이 생기지 않게 꽉 채우고

3. buf(name)를 출력하는 것

 

 

처음엔 3으로 flag_buf에 flag값을 load시킨다.

그 뒤에 2

    i) name은 16을 채워준다.

    ii) age 는 int = 4byte니까 8개만 채우면 되는데, 그럼 뒤에 NULL이 들어가기 때문에 4byte보다 크게 넣어준다.

        * 꽉 채우지 않으면 NULL이 들어감

 

이제 name을 출력하면  name ~ age ~ flag 가 한 번에 나온다.

+  �는 %s와 age의 int가 호환되지 않아서 깨져 나오는 것이다.

 

만약 4비트보다 '크게' 안 하면 아래 사진처럼 됨.

 


회고

printf("%s" , 변수 ); 이렇게 있을 때는 변수가 '할당된 크기' 만 가져오는 것이 아니라

\n 혹은 NULL 을 만나야 가져온다.

 

이런 걸 알고보니 더 촘촘하게 프로그래밍 하는 게 중요한 것 같다.