선릉역 1번 출구
[adventofcyber2023] - Day_6_Memory corruption Memories of Christmas Past 본문
[adventofcyber2023] - Day_6_Memory corruption Memories of Christmas Past
choideu 2023. 12. 9. 11:47Story: 코드가 표준에 부합하는지 확인하기 위해 남극의 일부 Frostings는 B팀의 지원을 받아 메모리 손상 취약성에 대해 빠른 교육 세션을 받게 됨
목표: 특정 언어가 어떻게 메모리를 안전하게 처리하지 못하는 지 이해하기, 변수가 인접한 메모리로 overflow되는 것 이해하기, buffer overflow를 통해 액세스해서는 안 되는 메모리를 직접 변경해보기
1. Memory corruption
- 프로그램을 실행할 때 모든 프로그램은 RAM으로 올라감
- 메모리에 저장된 각 변수는 개발자가 의도한 대로 특정 방식으로만 조작이 가능하나, 특정 변수의 메모리 부분을 수정한다면 영향을 미칠 수 있음
2. Accessing the Debug Panel
-*특정 변수의 메모리 레이아웃을 관찰해보자
- 디버깅 인터페이스
- ASCII: 메모리 내용이 ASCII 인코딩으로 표시되며 문자열로 저장된 데이터를 읽을 때 유용함
- HEX: 메모리 내용이 HEX 인코딩으로 표시되며, 모니터링하려는 데이터가 원시 숫자이거나 ASCII 문자열로 표시할 수 없는 기타 데이터인 경우 유용함
3. Strings in More Detail
- 변수를 문자열로 읽을 때 게임은 처음 발견된 Null 문자에서 중지되므로 더 작은 문자열을 더 큰 용량의 변수에 저장이 가능함 > Null 바이트 뒤에 나타나는 모든 문자는 값이 있더라도 무시됨
- 과거 c++의 경우 기본적으로 배열의 경계를 확인하지 않기 때문에 조심해야함
- 해당 사진에서 원래 변수인 player_name을 넘어선 coins의 변수 값까지 player_name으로 읽어들임
4. Integers and the Coins Variable
- c++의 경우 정수가 메모리에 "리틀 엔디언"방식으로 저장됨