[FTZ] 해커스쿨 Level16

보안/시스템 보안 2018. 4. 25. 22:12

[해커스쿨] Level16




1. level16에 접속을 하면 위의 힌트를 볼 수 있다. 아래의 소스 코드를 살펴보자.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
void shell(){ // 쉘 권한을 획득
    setreuid(30973097);
    system("/bin/sh");
}
 
void printit(){ // 출력 함수
    printf("Hello there!\n");
}
 
main(){
    int crap;
    void (*call)()=printit; // call 포인트 변수에 printit() 함수의 주소지를 넣음
    char buf[20]; // 문자열 배열 buf를 20byte크기만큼 선언
    fgets(buf, 48, stdin); // buf에 48byte 크기만큼 읽어온다.
    call();
}
//cs









2. 소스코드를 보고 난 후 /home/level16 디렉토리에 있는 attackme 파일을 gdb 파일로 열게 된다면

간단한 어셈블리어를 볼 수 있다. 함수가 선언된 부분은 어셈블리어에서 따로 표시가 안 되어서 

gdb 창에서 위의 그림처럼 입력하면 된다.


(gdb) p shell

(gdb) p printit


(gdb) p 함수명


위의 명령대로 입력을 하게 된다면 함수가 위치해 있는 메모리 주소를 볼 수 있다.



그리고 어셈블리어에서 보면 main+6 줄에서 어떤게 이동을 하는 지 볼 수 있다.

저 위치에 있는 함수는 call 포인트 변수에 printit() 함수를 넣고 있다. 그렇다면 

0xfffffff0(%ebp)에 저 함수를 넣는다는 소리인데, 스택의 제일 위의 메모리 주소는

0xffffffff이니깐 맨 끝자리의 0을 빼고 나면 f가 남는데, f는 10진수로 15다.


printit()는 ebp레지스터의 시작점부터 15만큼 떨어져있다는 소리다.[epb-15]가

printit()의 주소지다.



선언된 자리 56byte에서 15byte만큼 뺀다면 41byte 메모리만큼 덮으면 공격을

할 수 있다.









king poetic






'보안 > 시스템 보안' 카테고리의 다른 글

[FTZ] 해커스쿨 Level17  (0) 2018.04.27
[FTZ] 해커스쿨 Level18  (0) 2018.04.27
[FTZ] 해커스쿨 Level15  (0) 2018.04.24
[FTZ] 해커스쿨 Level14  (0) 2018.04.23
[FTZ] 해커스쿨 Level13  (0) 2018.04.17

설정

트랙백

댓글