환경 : 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 viwer와 crash파일을 로드 한 뒤 “!mona stackpivot -o” 명령어를 치면 ESP를 조정할 수 있는 Gadget들을 찾아준다.
찾은 Gadget을 보면

이렇게 많이 있는데 이제 덧셈만 하면 된다.
EIP가 42424242일때 ESP는 19eb50이다 그리고 이 ESP가 파일이 넘치는 구간에 있어야 하므로 Gadget을 찾아본다.

파일이 넘치는 구간에 Shellcode가 들어 갈 만큼의 공간이 있는 Gadget은 ADD 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 |