학습 기록일지
Dreamhack - Sint 본문
2레벨 마지막 문제이다.
문제의 보호기법을 이러하다
sint 문제의 소스코드
Line 6~19 : 기본설정
Line 21~24 : /bin/sh 주입이 가능한 get_shell 함수
Line 26~48(Main) :
- 28 : buf를 256크기만큼 선언
- 29 : int 형 size 선언 (초기화 X)
- 33 : Segmentation Fault 인터럽트가 발생하면 get_shell 함수가 실행되게 설정한다
- 36 : 숫자를 입력받는다
- 38~42 : 만약 입력받는 숫자가 256보다 크거나, 0보다 작다면 프로그램을 종료함
- 44,45 : read함수로 입력을받는데....
문제의 요지가 에러발생시켜서 get_shell을 실행시키는게 목표인거같다.(아마도)
문제의 흐름은 다음과 같다.
Size 를 입력받고, 데이터를 입력받는다.
여기서 Size는 256크기를 넘을 수 없으며 0크기보다 작을 수 없다.
따라서 음수가되거나 버퍼보다 큰 257바이트를 입력받을수 없다는거다.
하지만 read함수와 if 조건문을 잘 보면 취약점이 존재하는데, 0을 입력받게되었을때 0 < 0 불일치하므로 조건문을 건너뛰게되고, size -1을 진행하여 read(0, buf, 0 - 1); 이 된다.
read(0, buf, 0 - 1);
함수를 컴파일해서 돌려보니 제한없이 입력을 받을 수 있는거같다.
read함수에 브포를 걸고 메모리의 변화를 살펴보자
size = 0,
data = A*256
총 256자를 입력했을 때.
Main 리턴 : 0xf7de8e46
8바이트를 추가로 입력한다
buf크기인 256을 넘어 리턴주소마저 덮어버린걸 확인할 수 있다.
문제의 요지는 에러를 발생시키는것이니 Segementation Fault 가 발생하여 get_shell이 실행된다.
== 코드 ==
nc host1.dreamhack.gaems [포트]
Size: 0
Data: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCCCCCC
=========
역대급으로 쉬웠던거같다.
Integer Issues 만 잘 숙지하고있다면 푸는대 문제없음
'워게임 > 포너블' 카테고리의 다른 글
Dreamhack - out_of_bound (0) | 2021.06.14 |
---|---|
Dreamhack - off_bye_one_000 (0) | 2021.06.10 |
Dreamhack - basic_exploition_003 (0) | 2021.06.07 |
Dreamhack - basic_exploitation_001 (0) | 2021.05.26 |
Dreamhack - basic_exploitation_000 (0) | 2021.05.20 |