오래 못 할 짓 하지 않기
[ 워게임 ] 48. Pwnable 69 : memory_leakage 본문
이건 메모리 구조를 한 번 봐야겠다.
구조체가 어떤 크기로 저장되는지 확인해보자.
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 을 만나야 가져온다.
이런 걸 알고보니 더 촘촘하게 프로그래밍 하는 게 중요한 것 같다.
'보안_모의해킹 > CTF (Capture The Flag)' 카테고리의 다른 글
[ 워게임 ] 50. Pwnable 356 : Format String Bug (못 풀었음) (0) | 2025.03.24 |
---|---|
[ 워게임 ] 49. Pwnable 66 : basic_heap_overflow (0) | 2025.02.17 |
[ 워게임 ] 47. Reversing 667 : Simple Crack Me (0) | 2025.02.16 |
[ 워게임 ] 46. MISC 104 : broken-png (0) | 2025.02.16 |
[ 워게임 ] 45. Crypto 559 : SingleByteXor (0) | 2025.02.16 |