Be myself :: 간단한 Shellcode 만들기

달력

32024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

   

그냥 인터럽트 걸고 eax,ebx,ecx,exd 나 mov and sub 명령어를 막쓰면,, 저렇게 널바이트가 생긴다.

널바이트가 생기면 위에서 사진에서 보이듯이 우리가 원하는 실행결과가 나오지 않는다.

따라서 널바이트를 생기지 않게 하기 위해 명렁을 간결하고 메모리를 최소한 이용해서 짜야한다.

일단 문자열을 레지스터에 등록하기 위해 함수를 호출하면 리턴주소가 쓰인다는 점을 이용해서 함수 호출 후 pop해 ecx에 문자열 주소값을 등록하는 과정을 볼 수 있다. 이때, 함수 호출 부분을 제일 밑으로 내린 이유는, 처음에 부분에 쓰면 양의 값으로 주소값이 증가되기 때문에, 이부분에서 null바이트가 생길 수 있다. 따라서 밑에서 쓰고, 나머지 명령어들은 mov는 자제하고 쓸 경우 al,bl,cl,dl등을 이용하고 숫자 증가 inc나 dec명령어 등을 입력해 셸코드를 최소화 한다.

   

이런식으로 작성을 완료하면 널바이트 없이 셸코드가 완성된다.

------------------------------------------------------------------------------------------

                                                          <본격적으로 만들기>

사실 위와 같이 함수를 이용해 독자적인 셸코드를 생성할 수 있지만, 좀 더 경량화된 셸코드를 생성하기 위해선 스택을 이용할 필요가 있다. 즉, 스택에 아스키코드로 문자열을 하나하나 올려 (mov 대상 esp) 처럼 쓴다면, 함수 호출로 인한 코드의 수가 줄어 들 것이다. 사진을 한번 보자.

위와 같이 완성될 수 있다.

execve 시스템 콜 번호는 11번이다.

   

여기서 더 작게 만드는 방법이 있다.

바로 cdq(Convert Doubleword to Quadword)라는 명령어와, 스택을 이용하는 방법이다.

cdq를 이용하는 방법은 다음과 같다.

사실 cdq는 32비트 정수에서 64비트 정수로 확장하는 개념인데, 동작상 EAX부호 비트가 0이면 EDX레지스터도 0으로 만든다.

스택을 이용하는 방법은 eax에서 시스템 콜번호를 쓸때 mov 대신, push BYTE 0xb 한다음 pop eax하면 코드가 1바이트 더 작아진다.

출처: 해킹과 공격의 예술 공부중 정리

'Exploit' 카테고리의 다른 글

C++에서 VTable  (0) 2014.07.12
여러 보호기법  (0) 2014.07.11
SEH overwriting  (0) 2014.07.10
윈도우 BOF  (2) 2014.05.28
FSB공격 정리  (0) 2014.05.04
Posted by flack3r
|