목록시스템 해킹 (23)
ii4gsp
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/o6oit/btqA0O4vGwv/jaKxXZCcWcK6jsndxNuxaK/img.png)
힌트 파일을열어 보니 소스코드가 주어지는데 이전에 풀었던 level11과 strcpy()함수가 아닌 gets()함수로 바뀐것빼고는 유형이 같다. gdb로 attackme파일을 열어 disas main을 하고 부분에서 0xfffffef8은 2진수로 1110 1111 1000인데 1의 보수를 구하면 0001 0000 0111이되고 2의 보수를 구해주면 +1이 되기때문에 264가 된다. str에서 ebp까지의 거리는 264byte라는것을 알 수 있다. ret는 ebp의 4byte 아래에 위치함으로 268byte다. export shellcode=$(python -c 'print "\x90" * 20 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Bx8rt/btqAWbzYkrJ/tfvzfoZkp0kM8aumls5BHK/img.png)
힌트를 보니 소스코드만 던져주었다. 디버깅을 하기위해 cp attackme /tmp명령어로 tmp폴더로 attackme파일을 복사해주고 gdb로 attackme를 열고 disas main을 해주면 str은 256바이트를 할당해주었는데 8바이트 dummy가 추가로 붙은것을 알수있다. 10진수 256은 16진수 0x100이다 과 부분을 보면 0xfffffef8은 2진수로 1110 1111 1000인데 1의 보수를 구하면 0001 0000 0111이되고 2의 보수를 구해주면 +1이 되기때문에 264가 된다 ebp-264부터 입력값을 받는 것을 알 수 있다. ebp-264에 argv[1]을 덮어쓰는 작업을 하고 난 후인 *main+53에 break point를 걸고 ret에 넣을 주소를 구해보려한다. 243by..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bP9kBh/btqAXQOtxyv/RBaHKmKVy5mfsBEFnsISdk/img.png)
힌트를 보니 /usr/bin/bof의 소스코드를 보여주고 level10의 권한을 얻으라고 한다. fgets함수에서 버퍼 오버플로우 취약점이 발생한다. buf가 10칸 할당받았는데 fgets에서 40만큼 입력을받기때문에 buf공간이 넘쳐 buf2영역까지 인자를 전달하여 buf2의 첫 두글자가 go가 되게하면 쉘을 획득 할수있을것이다. hint의 소스코드를 /tmp 디렉토리에 bof.c라고 저장하였다. 저장된 bof.c를 vi 에디터로 열어 한글을 제거하였다. gcc로 컴파일해주고 gdb로 disas main 명령어를 실행해보니 0xffffffd8은 1101 1000에서 1의 보수를 해주면 0010 0111(39)이 되는데 2의 보수로인해 +1이 됨으로써 40이된다. [ebp-40] 만큼 문자열을 입력받는다..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/SwCZ4/btqAU6dFDGp/K1Wh7arn0jdaZrWhrYNF10/img.png)
HDD를 CD-Rom으로 인식시키기 위해 GetDriveTypeA의 리턴값을 알아야 하는것 같다. GetDriveTypeA의 리턴값을 몰라도 문제는 풀수있다. GetDriveTypeA함수의 리턴값을 알아보자 위의 표는 return값에 따른 drive의 type이다. HDD의 리턴값은 3이고 CD-Rom의 리턴값은 5이다. 첨부파일에 있는 프로그램을 실행시켜보면 오류가 발생하고 꺼지게 된다. 방법1 GetDriveTypeA함수의 리턴값을 알기 위해 GetDriveTypeA함수를 호출한 다음에 Break(F2)를 걸어 주었다. 레지스터의 값을 확인해보면 현재 EAX 값이 3이므로 HDD의 return value는 3이라는 것을 알 수 있다. break를 풀어주고 F8로 한줄씩 실행해보면 ESI레지스터는 IN..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/reBSB/btqARYnbsVh/zVfbMowR6qo5y288wXhtAk/img.png)
파일 실행을하면 콘솔창의 아주 간단한 프로그램이 실행된다. 키값을 입력하라는 문구가 뜨고 이것이 뜸으로써 임의의 키값을 넣었을때 다음과 같은 문구가 뜬다. 방법 1 올리디버거로 파일을 열어 main()함수를 열어 내려가다 보면 파일 실행시 나오던 문구가 보인다. 좀 더 내려가다보면 stricmp라는 문자열 비교 함수를 볼수있다. 문자열 비교를하고 문자열이 같을때 뜨는 문구와 문자열이 다를때 나타나는 문구가 보인다. 디버거에서 프로그램을 실행하여 임의의 값을 넣어주고 입력한 임의의 값이 어떤값과 비교하는지 알아낼수있다. 방법2 또 다른 방법으론 프로그램의 흐름을 바꿔주는 것이다. main()함수에서 조금 내려보면 다음과 같은 어셈블리 코드를 볼수있다. JNZ는 결과가 0이 아닐 때 점프하므로 결과가 0일때..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/2GoUX/btqzOlJRBWX/c7k2BSVA53TEc9MsdR3jI0/img.png)
프로그램 실행 시 Segment에서 무슨 일이 일어날지 알아보자. 프로그램이 실행되어 프로세스가 메모리에 적재되고 메모리와 레지스터가 어떻게 동작하는지에 대해 알아보기위해 간단한 프로그램을 만들어 보자. [root@ftz root]# vi test.c 소스파일을 하나 만들어주고 사진에 보이는것과 같이 소스코드를 작성하였다. [root@ftz root]# gcc -o test test.c 해당 소스파일을 컴파일 시켜서 test라는 파일 하나를 생성하였다. [root@ftz root]# gdb test 디버깅하여 어셈블리코드와 메모리에 적재될 Logical address를 보기 위해 gdb를 실행한다. 위 사진은 test파일의 어셈블리 코드들이며 앞에 붙어 있는 주소는 Logical address이다. di..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/c92SYE/btqzOWihFAK/HID178clIHiEecc7kXYM8k/img.png)
1.버퍼 오버플로우(Buffer Overflow)란? 버퍼 오버플로우(Buffer Overflow) 줄여서 BOF라고도 한다. 시스템 해킹의 대표적인 공격 방법 중 하나이며, 버퍼(Buffer)라는 것은 보통 데이터가 저장되는 메모리 공간을 일컫는데 단순히 메인 메모리만이 아닌 다른 하드웨어에서 사용하는 임시 저장 공간 역시 버퍼(Buffer)라고 부른다. 컴퓨터 시스템 내에서 프로그램이 사용하는 메모리 영역을 정해진 범위 밖까지 메모리가 넘치게하여 프로그램의 실행 흐름을 바꾸거나 특정 데이터를 변조하는 방식의 공격 방법을 의미한다. 버퍼 오버플로우(Buffer Overflow) 공격 기법을 이해하기 위해서는 무엇보다 컴퓨터에서 실행되는 프로세스의 구조와 자료 저장 방식, 함수 호출 과정 및 리턴 과정,..