티스토리 뷰
level11을 시작 해보자!!!
먼저 로그인을 하고
ls를 하면 hint가 보인다.
cat hint로 hint를 보니
이렇게 나왔다.
버퍼오버플로우 문제 처럼 보이는데
일단 find / -user level12 -perm -4000 2>/dev/null을 쳐보니
attackme가 나왔다.
./attackme를 해보니
Segmentation fault가 나왔다.
vi test.c를 만들어서 코드를 따라 치고
gcc -o test test.c로 컴파일 하여
gdb test를 하였다.
어려워서 곰곰히 생각을 하다가
뭔가 버퍼오버플로우에 대해서 먼저 공부를 하고 해야 할 것 같아서
공부를 하였다.
그 전에 먼저 알아야 할 것들을 공부하였다.
하나의 프로세스를 실행시키면 이 프로세스를 segment라는 단위로 묶어서 가용 메모리 영역에 저장시킨다.
여러 개의 segment들이 저장할 수 있는데
segment에는 code segment, data segment, stack segment로 구성 되어있다.
시스템에는 최대 16,383개의 segment가 생성될 수 있고
하나의 segment는 최대 2^32byte의 크기를 가질 수 있다.
code segment는 instruction들이 들어있다.
이것은 기계어 코드로써 컴파일러가 만들어낸 코드이다.
instruction들은 명령을 수행하면서 많은 분기 과정과 점프, 시스템 호출 등을 수행하게 되는데
분기와 점프의 경우 메모리 상의 특정 위치에 있는 명령을 지정해 주어야 한다.
하지만 segment는 자신이 현재 메모리 상에 어느 위치에 저장될 지 컴파일 과정에서는 알 수 없어
정확한 주소를 지정할 수 없다.!!!!!!!!
따라서 logical address를 사용한다.
logical address는 실제 메모리 상의 주소와 매핑되어
실제 주소 physical address는
segment selector가 시작 위치 offset을 찾아
offset+logical address라고 할 수 있다.
data segment는 프로그램이 실행시에 사용되는 데이터가 들어간다.
stack segment는 현재 수행되고 있는 handler, task, program이 저장하는 데이터 영역으로
버퍼가 바로 이에 들어간다.
이제 CPU가 이 프로세스를 실행하기 위해선느 프로세스를 CPU에 적재시켜야 하는데
이를 위해 레지스터를 사용한다.
레지스터에는 범용레지스터, 세그먼트 레지스터, 플래그 레지스터, 인스트럭션 포인터로 구성된다.
범용 레지스터는 논리 연산, 수리 연산에 사용되는 피연산자, 주소를 계산하는데 사용되는 피연산자, 그리고 메모리 포인터가 저장되는 레지스터다.
세그먼트 레지스터는 code segment, data segment, stack segment를 가리키는 주소가 들어있는 레지스터다.
플래그 레지스터는 프로그램의 현재 상태나 조건 등을 검사하는데 사용되는 플래그들이 있는 레지스터이다.
인스트럭션 포인터는 다음 수행해야 하는 명령이 있는 메모리 상의 주소가 들어가 있는 레지스터다.
'모각코' 카테고리의 다른 글
| 2019년 6월 26일 모각코 결과 (0) | 2019.06.26 |
|---|---|
| 2019년 6월 26일 모각코 (0) | 2019.06.26 |
| 모각코 1월22일 (0) | 2019.01.22 |
| 모각코 1월 17일 결과 (0) | 2019.01.17 |
| 모각코 1월17일 (0) | 2019.01.17 |
