프로젝트

1-day Exploit 실습

da1seun9 2020. 2. 21. 17:48

환경 : Windows 10 64bit

Exploit 대상 소프트웨어 : Faststone - max viewer

 32bit운영체제 Dword(4byte)

 

1-day 파일과 소프트웨어를 구해서 실습을 진행하도록 한다.

확인을 해보기 위해 bat파일을 만들어 위 사진처럼 내용을 작성한 뒤 저장한다.

bat파일을 실행을 시키면 windbg가 실행되면서 해당 소프트웨어와 이미지파일이 로드된다.

 

F5를 눌러 진행을 하다 보면 41414141로 뜨면서 멈출 때가 있다.

RET부분으로 다음 주소로 갈 수 없기 때문에 일어나는 Segmentation Fault이다.

 

아까 맨 처음(Exploit 실습)에 보았던 Stack BufferOverflow 와 같은 현상이 일어났다.

 

HxD를 켜서 Ctrl + F로 확인을 해보면

이부분이 나오는데 바로 여기가 Stack BufferOverflow가 일어나는 부분이다.

만약 여기를 42424242로 고치면

그대로 42424242부분이 나온다.

명령어 “kb” 를 하여 Call Stack확인을 하고 저 파란 박스의 내용을 Disassembly창에 넣으면

이렇게 이전에 진행된 Call ECX를 볼 수 있다.

브레이크포인트를 77718db0에 걸어 둔 후

Call ECX를 확인했다.

“!exchain”명령어를 사용하여 42424242의 위치를 알아낸 후

 

해당 주소의 memory를 보면

이 부분이 아까 변조시킨 RET부분이다.

 

Exploit을 어떻게 할 것인지 생각을 해보자면

 

우선 버퍼 오버 플로우로 RET가 변조되어 원래 가야 할 주소에 안 가고 파일의 부분이 차지 한 다.

 

또한 쓰기가 불가능한 버퍼이므로 이곳에 우리가 쓸 수 있는 스택을 쌓아 변조(Fake Stack)

까지 생각을 해볼 수 있다.

 

이렇게 여러 Gadget을 이용해서 쓰기 가능한 공간에 Fake Stack을 구성해 놓고 Chaining하는

기법을 StackPivoting이라 한다.

 

Immunity debugger을 이용하여 max viwercrash파일을 로드 한 뒤 “!mona stackpivot -o” 명령어를 치면 ESP를 조정할 수 있는 Gadget들을 찾아준다.

 찾은 Gadget을 보면

이렇게 많이 있는데 이제 덧셈만 하면 된다.

 EIP42424242일때 ESP 19eb50이다 그리고 이 ESP가 파일이 넘치는 구간에 있어야 하므로 Gadget을 찾아본다.

파일이 넘치는 구간에 Shellcode가 들어 갈 만큼의 공간이 있는 GadgetADD ESP ,838 이다.

19eb50+838 = 19f388 이 주소가 ESP가 이동할 주소이다.

 

Gadget ADD ESP주소( 0050aa6c )42424242로 채워져 있는 RET에 넣고 다시 windbg로 디버깅하면

이번에는 c0c0c0c0으로 바뀌어 있는 것을 볼 수 있다.

명령어 “r”을 눌러서 보면

ESP 19f388이 아닌 19f398에 온 것을 볼 수 있다.

이것은 ESP 19f388에 왔다가

Gadget에 의해 POP * 3가 일어난 후의 ESP의 위치이다.

(레지스터는 32bit운영체제이므로 4byte의 용량을 가져 pop을 했을때 4byte씩 esp의 주소가 커진다)

memory창으로 19f398이 위치한 곳을 잘 본 뒤

이렇게 고쳐 본다.

다시 windbg로 디버깅을 하면

이렇게 위에 41414141로 표시한 부분으로 ESP가 이동한 것을 볼 수 있다.

이 부분이 RET이므로 여기에 JMP ESP Gadget을 넣고 Shellcode를 뒤에 작성하면 끝이다.

 

이제 아까 와 같이 Immunity debugger에 소프트웨어와 Crash파일을 로드하고

“!mona jmp -r esp” 명령어를 입력하여 JMP ESP Gadget을 찾는다.

 

파란 박스에 JMP ESP의 주소(005b2ad2)를 넣으면 ESP이 바로 다음으로 이동된다.

그 다음부분이 Shellcode이므로

계산기 Shellcode가 실행된다.

정상적이라면 이미지가 보여지고 종료를 했겠지만 취약점을 이용한 공격으로 인하여 본래의 코드대로 수행되지 않고 임의로 넣은 Shellcode대로 수행되는 것을 볼 수 있다.

 

여기까지가 1-day 실습이다.

 

레지스터는 32bit운영체제이므로 4byte의 용량을 가져 pop을 했을때 4byte씩 esp의 주소가 커진다

☆메모리의 한 주소에는 1byte(8bit)의 용량을 가진다

'프로젝트' 카테고리의 다른 글

Network basic training  (0) 2020.06.25
Windows Software Zer0-day hunting  (0) 2020.02.21
SEH overwrite  (0) 2020.02.17
Trampoline Technique  (0) 2020.02.16
Basic Stack BufferOverflow  (0) 2020.02.16