2021. 11. 20. 22:00ㆍFTZ [해커스쿨]/level
Login Id : level9
Password : apple
힌트를 열어보면
위를 보면 코드가있는것을 볼 수 있다. 이 코드가 우리가 /usr/bin/bof라는 파일을 실행시킬때 사용되는 명령어이다.
그러면 이 명령어가 어떻게 생겼나 한번보자
일단 메인 함수를 열고 문자형 배열 buf와 bu2를 각각 10의 크기로 만들고
"It can be overflow : "라는 문자열을 출력한다. 그 다음 buf에 문자를 40byte만큼 받아오고
만약 buf2에 처음으로부터 2바이트 가량의 내용이 go와 같은지 비교한 후 같을 경우 "Good Skill!"를 출력하고
레벨 10이라는 권한을 부여 한뒤 쉘을 실행시킨다.
자 그러면 지금 우리가 해야할 것은 buf2에 go라는 값이 들어가게 해야하는데 분명히 입력을 받는 변수는 buf이다.
하지만 문제를 보면 buf의 크기는 10byte인데 왜 40byte의 값을 받는걸까? 만일 10byte를 넘게 값을 입력하면 어떠한 일이 생길까라는 의문이 들지 않는가? 이러한 의문에서 나온 기법이 bof(buffer overflow)이다. bof가 그럼 무엇이냐?
일단 이를 알기전에 우리는 main함수가 호출 되었을 때 즉 이 프로그램이 실행될 때 어떤식으로 메모리에 저장되는지 확인해보자
일단 root계정으로 level9의 위치에 bof.c라는 파일을 만들었다. 위의 코드를 그냥 복사 붙여넣기를 했다.
자 그러면 이 프로그램을 분석해보자
일단 root로 bof.c를 컴파일 후 gdb를 통해 어셈블리 코드를 분석해보자
이렇게 입력을 하게 되면 이렇게 긴 영어문장이 나오는데 이 것들을 없애기 위해서 -q를 사용했다.
자 이렇게 하면 gdb에 들어와지는데 gdb(GNU Debugger)란 GNU 소프트웨어 시스템을 위한 기본 디버그 즉
디버그는 컴퓨터 프로그램 개발 단계 중에 발생하는 시스템의 논리적인 오류나 비정상적 연산을 찾아내고 그 원인을 밝히고 수정하는 과정이라 위키백과에 정의 되어있다.
우리는 이러한 디버거 과정을 통해서 bof프로그램을 분석할 것이다.
실행을 하게 되면 이러한 어셈블리 코드가 나온다. 자 그럼 이것을 스택으로 변환하여서 보면 이러한 모양이 된다.
음.... 내가 스스로 이 자료를 해석할 줄 모르겠어서 내일 부터는 드림핵(dreamhack)의 리버스 엔지니어링을 공부하고 와서 다시 시작해야겠다.