일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- aws lambda
- 정처기
- 스마트 컨트랙트
- File Upload
- splunk db connect
- 탈중앙화
- 오블완
- web security academy
- 블록체인
- 티스토리챌린지
- metacode
- AWS CLI
- 스마트컨트랙트
- amazon s3 트리거
- 메타코드M
- ELB
- 정보처리기사
- 정처기 필기
- 정처기필기
- aws 트리거
- web3
- web3 보안
- web shell
- AWS SSM
- 보안 그룹
- Path Traversal
- 메타코드
- Session Manager
- metacodem
- systems manager
- Today
- Total
min8282
[취약점분석] Integer Overflow, Uninitialized(시스템 해킹 실습 2일차) 본문
memory corruption
발생하면 컴퓨터가 종료될 수 있는
논리 커럽션
컴퓨터 입장에서는 할 일 하는데 사람이 확인 안 해서? 발생하는 것
개발을 진행할 때 int형 변수는 사이즈, 범위, 크기 등을 넣을 때 자주 사용한다.
이 범위가 달라지거나 변조되면 큰일이 나겠죠? ->> 메모리 커렵션
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로 이뤄짐
이전에 쓴 공간에 뭐가 있는지 알고 사용해? 사용하기 전에는 초기화를 해야 돼.
해당 게시글은 복습을 위한 실습 내용 필기이므로 올바르지 않은 정보가 포함되어 있습니다.
'K-Shield.Jr' 카테고리의 다른 글
[공통과정] 시스템 해킹/OOB, Format String 실습 및 메모리 보호기법 (1) | 2024.07.18 |
---|---|
[취약점분석] Command Injection(시스템 해킹 실습 1일차) (0) | 2024.07.18 |
[공통과정] 웹 해킹 (1) | 2024.07.15 |
[공통과정] 웹 해킹/HTTP의 이해 (1) | 2024.07.14 |
[공통과정] 네트워크 해킹/스니핑(Sniffing)(feat. Spoofing) (1) | 2024.07.14 |