해킹/시스템해킹

[시스템해킹 도전기 4편] 쉘코드(2)

놀고싶다~ 2021. 1. 31. 10:00

안녕하세요!

 

이전에 했었던 쉘코드를 이어서 진행 해보도록 하겠습니다!

(이번편을 보시기 전에 이전편을 보시고 와주세요!)

 

https://kamro17.tistory.com/entry

 

[시스템해킹 도전기 3편] 쉘코드(1)

안녕하세요~ 오랜만에 글을 씁니다 ㅎ.. 매일 매일 글을 쓰도록 노력해보겠습니다! 오늘은 쉘코드에 대해서 알아보고자 합니다! 쉘코드(shellcode) 1) 쉘코드의 의미 ◦ 시스템의 특정 명령을 실행

kamro17.tistory.com

4)쉘코드 제작 어셈블리

 

(1) 어셈블리 코드 제작

 

C언어 코드를 토대로 어셈블리를 제작 해보겠습니다.

 

어셈블리 코드의 내용은 message 내용의 “i2sec”을 출력한다는 의미입니다.

 

이후 어셈블리 언어로 컴파일을 하겠습니다.

 

 

무한루프가 발생하는 이유는 exit(0) : 종료 코드가 없기 때문에 무한으로 발생 하는 것을 볼 수 있었습니다

 

따라서 어셈블리 코드에 종료 코드를 삽입하여 수정해보겠습니다.

 

종료코드를 삽입 후 다시 컴파일 하여 실행 해보겠습니다.

 

5)쉘코드 제작 쉘코드(기계어) 추출

 

만들었던 어셈블리 파일을 통해서 쉘코드를 추출 해보도록 하겠습니다.

 

위 코드를 자세히 보시면 0x00 이 그대로 나온 것을 볼 수 있습니다 이 코드는 널바이트를 의미 하면서 기계어 코드를 넣고 실행 했을 시에 끊김이 발생 할 수 있습니다.

따라서 널바이트를 제거해주는 작업을 진행 하도록 하겠습니다.

 

널바이트 제거 방법

1. 0값을 삽입 한다.

XOR 연산을 이용 : 자기 자신을 XOR 하여서 0 값을 삽입한다.

2. short jmp : jmp short 2바이트만 사용한다

3. 레지스터 너비 수정 : 8비트, 16비트 레지스터 사용

 

어셈블리어를 수정 후 다시 컴파일을 하겠습니다.

 

쉘코드에 널바이트가 사라진 것을 볼 수 있습니다.

다시 쉘코드를 추출해보겠습니다.

 

6) 쉘코드 제작 쉘코드 완성

 

기계어를 완성한 C언어를 작성 해보았습니다.

 

i2sec이 잘 실행되는 것을 확인하였습니다!

 

이제 쉘코드를 작성하는 방법을 한 번 더 정리하고 마무리 하도록 하겠습니다.

 

★ 쉘코드 제작방법

 

1. C언어로 구현한다.

2. gdb로 어셈블링을 하여서 필요한 부분을 찾는다.

3. 시스템 콜에 필요한 필수 부분만으로 구현한다.

4. 컴파일 후 objdump 로 기계어를 출력한다.

5. null (nullpoint)이 존재할 시 null 값을 없애기 위해 어셈블리어를 수정하여 없앤다.

6. 기계어 코드를 출력후 다시 C언어로 구현하여 완성한다.

 

여기까지 따라오시느라 수고많으셨습니다!

하지만 이제 시작입니다 ㅎㅎ..

 

다음은 쉘코드 심화 편으로 찾아뵙겠습니다!

 

수고하셨습니다!