학습 기록일지

Dreamhack - Sint 본문

워게임/포너블

Dreamhack - Sint

KRMP 2021. 6. 17. 20:54

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