[pwnable with C++] namespace에 대해 정리
namespace는 클래스의 느낌이랑 비슷한 것 같다. 다만 오버라이딩 오버로딩 안되고 접근자 설정 못 해주고 뭐.. 그런 거? 그냥 딱 소속만 정해준다.
기본적으로 namespace는 외부를 끌어다 쓰거나 내부에서 새로 만들어서 쓴다.
using namespace std;
using namespace blahblah;
위와 같은 형식처럼 namespace를 사용할 수 있다 (충돌 위험으로 권하지는 않음).
소속을 지정해주지 않으면 대충 std랑 blahblah로 간주하겠다는 의민데, std::func1(), blahblah::func1()같이 이름이 같은 함수가 있다면 충돌 위험이 있다.
그리고 개발자가 스스로 namespace를 따로 만들어 줄 수 있다.
namespace asdf {
int a = 0xdeadbeef;
int b = 0x313370;
namespace qwer {
int a = 0x1234;
int b = 0x5678
};
void func() {
std::cout << "what?" << std::endl;
};
}
이렇게 namespace를 만들어줄 수 있는데, 보는 그대로 namespace안에다가 namespace를 만들어 줄 수 있고, namespace안에 함수도 만들어줄 수 있다.
이제 여기서 조금 재밌는 점이 한 가지 있는데, 저렇게 namespace안에 만들어 준 변수는 bss영역에 값이 초기화 된 채로 연속 된 주소를 갖는다.
그런데, namespace안에서 만들어 준 namespace나 함수는 독자적인 주소를 갖는다.
즉 구조체나, 객체에 접근할 때 처럼 접근하는 건 아니다.
변수 제외 그냥 코드 상에서만 소속을 정해주는 것이다.
namespace a {
int a = 1;
int b = 2;
namespace n {
int a = 1;
int b = 2;
int c = 3;
}
int c = 3;
}
위 코드를 작성했다고 치고 메모리를 보게 되면
a::a
a::b
a::c
위 세 변수는 연속된 주소를 갖는다.
그리고
a::n::a
a::n::b
a::n::c
위 세 변수도 연속된 주소를 갖는데 아까 위에서 선언한 변수들과는 독자적으로 연속된 주소를 갖는다.