본문 바로가기

해킹/System

#사진 날아감 [Windows_System] Shellcoding 쉘코딩법

반응형

글 날아가서 다시 썻습니다 

https://r3dzone.tistory.com/15

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

시스템 분야의 첫 글은 윈도우 쉘코딩으로 하고자 합니다.

쉘코드란? 시스템 함수를 구동하기 위한 코드로서 아키텍처 수준에서 작성된 코드입니다.

즉 공격 시스템의 아키텍쳐에서 시스템 함수를 불러오게 해주는 기계어 코드라고 저는 이해 하고 있습니다.

시스템 해킹에서 취약점이 터졌다면 그 취약점을 이용해 이 쉘코드를 해당 시스템에 올리므로서 시스템 함수를 이용해 원하는 프로그램,함수를 실행할 수 있기에 해당 시스템을 해커가 장악할 수 있는 것입니다.

이 쉘코드를 작성하기 위한 과정은

1.쉘코드에서 사용할 시스템 함수 찾기 

2.고수준언어(ex.C)로 시스템 함수를 불러오는 프로그램 작성 

3.해당 아키텍쳐에서 사용되는 어셈블리 추출 

4.기계어 추출

로 이루어져 있습니다.

일단 윈도우에서 사용가능한 시스템함수(프로세스 실행함수)들은 많습니다. winexec(), createprocess(), shellexecute()등등등.

각 함수별 특징,장점,단점들이 여러가지 있어 상황별로 사용하시면 됩니다. 저는 저는 사용이 간단한 winexec()함수를 사용할 것입니다.

이제 c언어에서 해당 함수를 실행해주는 프로그램을 작성해줍시다.

6번 라인을 보면 winexec함수에 인자로 들어갈 문자열을 배열에 저장해줍니다. 이는 나중에 프로그램을 어셈블리로 추출할 때 배열이기때문에 연속된 메모리주소를 가지기 때문에 사용 및 가독성에 좋습니다. 또한 마지막에 '\x0'으로 널바이트를 너어주므로서 문자열 인식을 끊기도록 해줍니다.

7번 라인에서 해당배열을 인자로 winexec함수를 동작시킵니다. 두번째 인자는 창표시를 킨다는 의미입니다.

8번은 해당 프로세스를 종료해줍니다. exit()함수로도 마찬가지로 동작합니다.

작성해준 프로그램이 잘 되는지 동작시켜봅니다.

정상적으로 동작한다면 위와 같이 계산기가 실행됩니다

이제 프로그램이 만들어졌으므로 어셈블리로 추출해줍니다. 추출은 비주얼 스튜디오를 통해서 간단하게 할 수 있습니다.

적당한 곳에 브레이크 포인트를 걸어주고 디버그해줍니다.

BP에 걸렸으면 ALT + G로 디스어셈블리로 이동할 수 있습니다.

위와 같이 설정해주시면 디스어셈블러가 친절하게 소스를 어셈블리로 뱉어내줍니다

위 어셈블리를 메모장등에 복사해주고 필요 없는 부분을 지워줍시다.

이제 필요한 부분은 함수를 불러오는 부분입니다. 저 상태로 동작시에는 제대로 제대로 프로그램이 동작하지 않으므로 winexec의 주소와 exitprocess의 주소를 알아올 필요가 있습니다.

저는 두 함수의 주소를 알아내기 위해 immunity 디버거를 사용할 것입니다. 올리디버거로도 같은 방식으로 찾아내실 수 있습니다.

일단 원리를 설명하자면 저 두 디버거에는 분석을 위하여 로딩된 dll에 있는 모든 API를 보여줍니다. 그리고 윈도우 프로그램은 kenerl32.dll을 반드시 로딩하게 되어있고 이 dll에는 윈도우 시스템 함수들이 저장되어 있습니다.

따라서 아무 프로그램이나 디버거에 넣어줍시다.

위와 같이 디버거에서 우클릭후 serch for에서 Name in all modules를 눌러주시면 이름순으로 불러온 모듈을 표시해줍니다.

해당 창을 클릭후 검색할 함수를 타이핑해주면 창에 해당함수가 검색됩니다.

winexec는 0x74143980의 주소를 갖고있는 것을 알 수 있습니다. 같은 방법으로 exitprocess의 주소는 0x74103a10임을 알아냈습니다.

위와 같이 어셈블리를 수정해줍시다.

 

비주얼 스튜디오로 돌아가서 해당 어셈을 테스트해줍시다.

 

정상적으로 계산기가 실행된다면 다시 디스어셈블리를 켜주고 코드 바이트 표시 옵션을 활성화 해줍니다. 이 코드 바이트가 저희가 추출해야될 기계어 코드입니다.

메모장에 해당 코드바이트를 복사해주고 16진수임을 표시하기위해 \x를 추가해줍시다.

다시 비주얼 스튜디오로 돌아가서

일단 프로젝트 설정으로가 DEP를 비활성화 해줍니다. 

DEP옵션은 스택에 올라와있는 코드가 로드되서 실행 되는걸 방지하는 보안옵션입니다. 따라서 이 옵션이 켜져있으면 쉘코드 실행시 공격으로 인지하고 프로그램을 종료하게 됩니다.

해당 옵션을 비활성화 한 후 테스트 해봅시다.

정상적으로 동작합니다! 쉘코드 작성에 성공하였습니다.

하지만 해당 쉘코드는 실전에서 사용하기에는 무리가 있습니다.

문제점1. 널바이트(\x00)이 쉘코드 중간에 있어 쉘코드를 중간까지만 읽어올수도 있다.

문제점2. 윈도우 vista부터는 aslr이 걸려있기 때문에 해당 시스템을 재시작할시에 쉘코드를 사용할 수 없다.


이 두문제를 해결 하기 위한 널바이트 제거와 유니버셜 쉘코드 작성은 차후 포스팅 하도록 하겠습니다.