c++ std::string 클래스에 대해 정리해보려 한다.
이걸 공부하게 된 계기는
std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>::basic_string(v1)
위와 같은 mangling된 c++ 함수를 분석하고자였다.
위 구문은 스택 오버플로우에서 std::string(v1)
과 동일하다고 말하고 있다.
이 string 클래스는 우리가 일반적으로 문자열을 다룰 때 사용하는 char와는 차이가 있다.
char형 배열, char형 포인터로 문자열을 다룰 때 char형 배열은 esp를 늘려 쭉 입력하는 형태이고 char형 포인터는 해당 주소에 문자열 주소를 가지고 있는 형태이다.
string 클래스로 문자열을 다뤄보기 전에 구현부를 보고 가자.
xxxxxxxxxx
class string {
char* content;
int length;
};
대충 의사 코드로 표현하면 위와 같이 생겼다. 실제로 string 클래스를 이용하여 할당한 후 메모리 값을 확인해 보겠다.
위 코드를 실행해 보겠다. (codegate 2018 SuperFtp code)
'seongjo'를 입력한 후 [ebp-0xac]를 쭉 확인해 보면
위와 같이 addr, length, 문자열 형태로 저장이 되어있음을 알 수 있다.
그리고 string 클래스로 입력받을 시 버퍼 오버플로우가 안나더라.. 초과된 부분을 heap에 allocate하여 저장한다.
c++ 잘하고싶다..
'system > material' 카테고리의 다른 글
2019 codegate preliminary 풀이 보고서 (0) | 2019.02.01 |
---|---|
dynamic, static, pie.. (0) | 2019.01.24 |
fastbin dup consolidate 정리 (0) | 2019.01.22 |
x86, x64 srop 정리 (0) | 2019.01.21 |
glibc 2.26 tcache 동작 분석 및 exploit (how2heap) (2) | 2019.01.15 |