해커스쿨 F.T.Z Level 9
level 9에는 새로운 것들이 많이 나오고 이후부터는 GDB로 분석을 해야 한다.
그렇기에 Break Time을 가지고 level 9로 넘어왔다. level 9를 바로 보고 이해가 된다면 괜찮지만 안된다면
이전 포스트 Break Time을 보고 오는 것이 이해가 더 잘 된다.
level 9에 로그인 후 hint를 본다.
"/usr/bin/bof"를 이용해 level 10의 권한을 얻어야 한다. 일단 실행시켜보고 시작하자.
bof 실행 후 아무거나 입력했다. 아무 반응이 없으므로 코드를 분석해야 한다.
fgets 함수를 이용해 buf 변수에 40바이트 입력받을 수 있게 했다.
이때 buf의 크기인 10바이트를 초과해서 입력하면 버퍼 오버플로가 발생한다.
버퍼 오버플로 기초적인 설명
bof의 권한이 level 9에서는 실행 권한만 있다. gdb로 분석하려고 해도 권한 오류가 난다.
하지만 우리는 이 프로그램 코드를 hint를 통해 알고 있다. 이 코드를 다시 작성해 우리가 직접 리버싱해야 한다.
bof의 코드를 똑같이 쓰고 컴파일까지 했다.
gdb를 이용해 어셈블리 코드로 리버싱 한다.
gdb에는 두 개의 문법이 존재한다. intel 문법과 at&t 문법이 있다.
intel 문법은 아래 나올 문법과 같은 것이고 at&t 문법은 "%, $" 등의 특수문자들이 들어 있어 조금 보기 불편 할지도 모른다. at&t가 편한 사람도 있다고 한다. 각자의 취향이니 두 가지 사용해보고 선택하면 된다.
또 다른 점은 at&t 코드는 [source] [destination]이고 intel은 그 반대다.
set dis intel intel 문법으로 바꿔주는 명령어.
disassemble (disas, disass, disasse.... ):: 프로그램의 어셈블리 코드 보는 명령어
disas [function] :: 함수 부분의 disassemble 한 코드들을 보여준다.
예를 들면 disas main은 전체 코드 다 보여준다.
disas [0xffffffa0] [0xffffffffa9] :: 주소 범위 사이의 어셈블리 코드를 보여준다.

어셈블리 레지스터에 대한 간단한 설명은 Break Time에 있다.

lea(Load Effective Address)
lea 명령어는 Load Effective Address란 의미로 다음의 인자를 주솟값으로 인식한다.
예를 들어 위 분석을 보면 ebp-40이 가리키고 있는 주솟값을 eax에 넣는다.
이때 ebp는 스택 프레임의 시작 지점 주소가 저장되는 것이다.
이 스택의 주소는 buf의 주소를 뜻한다.
다음 ebp를 보면 ebp-24다. 두 번째 스택이 시작되는 곳의 주소다.
이렇게 보면 buf의 주소와 buf2의 주소의 시작점의 거리가 16이 차이가 난다.
우리는 buf의 10byte를 주어서 정상적인 차이는 10이 차이가 나야 하지만, 그사이에 dummy 6이 들어가 있는 것이다.
dummy란 필요 없는 쓰레깃값을 말한다.
이때 우리는 bof를 일으켜 buf2에 go를 입력해야 한다.
buf 10byte와 dummy 6byte를 포함해서 16byte를 입력하면 buf2가 시작되는 주소다.
buf | dummy | buf2 | |||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 2 | 3 | 4 | 5 | g | o |
도식화하게 되면 위와 같다.