min8282

[취약점분석] Integer Overflow, Uninitialized(시스템 해킹 실습 2일차) 본문

K-Shield.Jr

[취약점분석] Integer Overflow, Uninitialized(시스템 해킹 실습 2일차)

min8282 2024. 7. 18. 09:05

memory corruption

발생하면 컴퓨터가 종료될 수 있는

 

논리 커럽션

컴퓨터 입장에서는 할 일 하는데 사람이 확인 안 해서? 발생하는 것

 

개발을 진행할 때 int형 변수는 사이즈, 범위, 크기 등을 넣을 때 자주 사용한다.

이 범위가 달라지거나 변조되면 큰일이 나겠죠? ->> 메모리 커렵션

integer.c

unsigned int 값은 음수를 제외하고 0~4,294,967,295까지 가능

max에서 +1을 하면?

0x100000000(16진수) = 4,294,967,295

1을 더하는 순간 4바이트를 넘어가게 됨. 5바이트가 됨.

근데 int 형이라고 선언을 했기 때문에 integer overflow가 발생??

 

max에 +1을 하면 5바이트가 되는데 컴퓨터는 4바이트까지만 넣어 주게 됨. 그럼 이 경우에는 0x100000000에서 0x10000000을 제외하고 0x0을 출력하게 됨.

 

-1은 0xFFFFFFFF 인데 이게 unsigned int로 읽게?되면 가자

위에 이해x

 

위는 오버플로우, 아래는 언더플로우


integer overflow

dir = Integer

integer.c = 저장소 코드

최대 사이즈 64

 

integer overflow로 buffer overflow로 연계가 된다.

 

    • malloc(40) : 힙이라는 영역에 40만큼 데이터 할당 후, 힙 주소를 나한테 알려준다.
    • free : 힙 공간을 사용 후, 아무나 사용할 수 있게 해 주는 거?

 

입력값이 저장될 때 =, 기호 두 개도 같이 포함돼서 저장되기 때문에 -2를 한다.

 

62 -63 = -1인데 integer overflow는 표현할 수 있는 가장 낮은 값은 0임. 이렇게 되면 가장 큰 자료형이 나옴. 0xFFFFFFFF요게 나옴. 그래서 이 검사가 제대로 동작하지 않는 것임. -1 이든. -2든 maxSize가 가장 큰 값인 0xFFFFFFFF가 되는 것임.

 

 

ax15를 입력하면 [stdin]에는 a문자 15개와 \n이 들어가게 된다. 이때 MAX_KEY_LEN을 디버깅했을 때, ax15개와 \n까지 가지고 오는 것으로 예상하고 코드를 작성했는데, 실제 MAX_KEY_LEN은 [stdin]에서 가지고 올 때, 개행문자를 제외하고 사용자 입력만 가지고 와서 개행만 남게 되어 1이 되고 -1 를 해서 0 이 돼서 invalid input

 

 

uninitialized

초기회 하지 않은 상태에서 데이터의 읽기 및 쓰기 수행 시 나타난다.

컴파일 이렇게

컴파일 이렇게 하기

힌트?)

크래시가 나면 = segmentation fault 가 난 것= 잘못된 주소를 참조해서 나는 에러

목표)

segmentation fault가 나서 강제종료 시키는 것이 목표

 

하나 알고 해야 한다. => Heap 특성 이용

 

설명)

0x30이라는 것을 할당해요. 그래서 free해서 그 주소를 해제해요. 0x30이라고 하면 그 앞뒤에 메타데이터를 해 놓는다. 요청을 하면 사용 중인 메모리 상태. 해제된 메모리 상태=폐쇄가 된 곳은 따로 관리를 해요. 그래서 30했던 곳을 free하는 거예요. 만약, 또 malloc을 하면 새로운 메모리 공간을 만드는 것이 아니라 앞에서 30만큼 할당하고 해제되어서 free가 되었으니까 이 부분에 할당을 한다. 굳이 새로 만들지 않고 놀고 있는 거에 들어가는 느낌?

 

a = malloc(0x20); // 0x1000
b = malloc(0x30); // 0x1020
c = malloc(0x40); // 0x1050

free(a);

d = malloc(0x20); // 이때 d는 0x1000을 할당 받게 됨.
// a에서 할당 한 곳이 이제 free 상태가 되어서 다음 malloc을 할 때 자유로운 a공간에 할당 된다.

 

소스코드 보고 파악하는 시간을 갖겠습니다.

간단한 데이터 저장 프로그램임.

 

프로그램 사용법을 간단히 알려주자면

allocate를 먼저 실행

0번에 넣겠다

 

힌트)

free함수.

rdi - 첫 번째 레지스터.

처음에 어디서 함수를 실행하는지 보고 bp를 건다. free를 실행하기 전 rdi와 하고 나서의 rdi 값을 비교해 보기

rdi의 내용을 봐야 돼. ni로 free 함수가 끝났을 때의 rdi를 보고 비교해보기

 

힌트)

segment fault 

내가 처리하지 못한 instruction에 멈춰 있음. 이 인자가 뭔지 모른다. 근데 잘 보면 [rdi]는 주소를 참조해서 뭐 할 때 괄호를 사용한다.

주소가 아닌 값에 가서 읽으려고 하니까 죽어버린다. seg fault.

그럼 왜 rdi에 왜 주소가 아닌 값이 들어가 있는가를 생각해야 됨.

bt를 사용해보면 

pd readData - 5660 / printf는 잘 못 된 게 아님. 이게 이상한 거면 내가 잘못된 인자를 준거임. 그럼 나는 여기 printf를 bp로 잡아서 인자를 확인해 보는 거야. rax는 인자로 전달하는 게 아니다? 어제 수업

 

해제되기 전에 데이터 상태랑 해제 직후 데이터 상태를 보면 도움이 된다.

디얼록에서 free함수가 호출돼서 여기에 bp를 잡고

b *deallocate+195

하고 free함수를 실행을 하고

실행 전과 실행 후 비교

 

readData에 data->ptrdl wkf ahtehla.

allocate의 배열에서 가지고 옴

이 친구는 struct data로 이뤄짐

 

이전에 쓴 공간에 뭐가 있는지 알고 사용해? 사용하기 전에는 초기화를 해야 돼.


해당 게시글은 복습을 위한 실습 내용 필기이므로 올바르지 않은 정보가 포함되어 있습니다.