bpsecblog.wordpress.com/2016/03/08/gdb_memory_1/
- 우리집에 GDB 있는데 ... 메모리 보고갈래? -
사실 이 글, 내가 중학교 3학년 때 봤던 글이다. 물론 제대로 이해하지 못하고 넘어간 내용들도 있을 것이다.
그러니, 다시 한 번 공부하고 넘어가보도록 하자.
📖(1)
먼저 내 노트북 램은 16GB 이다. 1Byte는 컴퓨터에서 주소공간 한 개의 크기다.
그래서 16GB는 2^35Byte이니, 저 만큼의 주소를 가질 수 있다. (엄청 많다 ㄷ ㄷ ㄷ ㄷ ㄷ ㄷ)
하지만 32bit의 cpu를 가지고 있다면 8기가나 16기가에 접근을 할 수 없다.
이 자료를 참고해서, 더 알아보자.
먼저 커널 영역에는 시스템 운영에 필요한 메모리와 운영체제가 올라가 있다.
그래서 사용자가 함부로 접근을 하지 못한다.
이제 유저 영역을 확인해보자.
일단, 코드 영역에는 말 그대로 코드가 올라온다. 어셈블리 코드가 올라온다. ( 디버거로 보면, 메모리 주소가 좌측에 보이니...)
데이터 영역에는 전역변수가 업로드 된다. 얘네들은 항상 주소가 고정되니 exploit에 활용이 될 수도 ...!
코드 영역과 데이터 영역은 주소가 고정되어 있다.
힙 영역은 동적할당을 해준다. 주로 malloc 함수가 건드는 부분이다.
지역변수는 스택 영역으로, 끝에서 부터 자라난다. 그 이유는 앞에서 부터 자라게 되면 커널 영역을 건들 수도 있기 때문이다.
📖(2)
//tomato.c
#include <string.h>
#include <stdio.h>
void func2() {
puts("func2()");
}
void sum(int a, int b) {
printf("sum : %d\n", a+b);
func2();
}
int main(int argc, char *argv[]) {
int num=0;
char arr[10];
sum(1,2);
strcpy(arr,argv[1]);
printf("arr: %s\n", arr);
if(num==1){
system("/bin/sh");
}
return 0;
}
이런 코드를 작성해보자. 파일 이름이 tomato인데, 진짜 스파게티 코드인 것 같다..............
우선, 이 코드를 컴파일을 해줘야 하는데 -fno-stack-protector 옵션을 넣을것이다.
그 이유는 gcc는 스택을 보호하기 위해 canary 라는 것을 넣는다.
그래서 Buffer Overflow로 canary를 덮었을 때 프로그램을 종료하는 것이다. (Stack Smash Protection 이라고 한다.)
이 옵션을 끄고 컴파일을 해주자.
컴파일을 시도하면 이런 오류가 발생함을 알 수 있다. stdlib.h도 인클루드 해주자. 무사히 되었다.
main 함수는 이렇게 생겼다. push rbp mov rbp,rsp 가 main 함수의 시작이므로 BP를 걸어보자.
오류를 해결하고 다시 실행해보자.
1004lucifer.blogspot.com/2014/11/gdbosx-mac-gdb.html
sourceware.org/gdb/wiki/PermissionsDarwin#Create_a_certificate_in_the_System_Keychain
위의 글들을 참고해보자. 그리고 다시 run 해보자. 그래도 안된다. 우선 sudo를 붙여서 실행을 해보자 ㅜㅜ
다 해결이 안된다. 우선 리눅스에서 실행해보자.
성공은 했는테 터미널 창 색깔이 눈이 너무 아프다. 좀 나중에 바꿔주도록 하자.
우선, 현재 브레이크 포인트가 걸려있다. 다시 disas main을 해보자.
현재 BP가 걸린 위치에 =>이 생겼음을 확인할 수 있
ni명령을 통해 다음 인스트럭션을 실행할 수 있다.
ni 명령을 두 번 정도 해주면 rsp의 값을 rbp에 저장하는 것을 볼 수 있다. 이 부분을 스택 프레임이라고 한다.
먼저 rbp, rsp 등의 레지스터에 관해 알아보자.
기존에 있던 rbp를 스택에 저장시킨다. 그리고 현재 rsp를 rbp에 저장하는 의미이다.
sum함수 호출하는 부분에 브레이크 포인트를 걸어보자. 그리고 c를 통해 저기까지 실행해보자.
이제 sum함수가 호출된다. 이런식으로 코드가 진행된다.
📖(3)
strcpy 함수에는 취약점이 존재한다. 좀 더 뜯어보자. 우선 strcpy 함수가 호출 되는 지점에 BP를 걸고 실행해보자.
사실 글을 읽어서 문제를 풀어도 되는데, 그냥 직접 문제를 해결해보자.
먼저 문자열로 값을 전달하면 안되기에 파이썬을 이용하여 값 전달을 해주자.
성공 재미있다.
'스터디 그룹 > ProjectH4C' 카테고리의 다른 글
ProjectH4C 3개월 1주차 과제(HackCTF - Basic BOF#2) (0) | 2021.03.18 |
---|---|
ProjectH4C 3개월 1주차 과제(HackCTF - Basic BOF#1) (0) | 2021.03.18 |
ProjectH4C 2개월 4주차 과제 (코딩도장) (0) | 2021.03.14 |
ProjectH4C 2개월 4주차 과제 (해커스쿨 ftz) (0) | 2021.03.12 |
ProjectH4C 2개월 3주차 과제 (포인터 5문제) (0) | 2021.03.07 |