포인터 인코딩
너무 포스팅이 뜸한듯 하여.. (아무도 강요하지 않지만) 그닥 도움 안되는 잡다구리한 내용이라도 끄적여 봅니다. 헤헤~

버퍼오퍼플로우 공격등에 당하지 않기 위해 포인터 인코딩이라는 방법을 이용하고는 합니다.
비스타에는 long-lived pointer 에 대해 포인터 인코딩을 이미 사용중이라고 하더군요. (확인은 못해봤습니다만...)
구현을 할까 하다가 혹시나 해서 MSDN 에 찾아봤더니 함수로 존재하더군요. 흐.. 역시 MSDN 엔 별게 다 있어요. ^^
MS 에서는 포인터 인코딩을 어떻게 구현했을까나 하는 생각에 좀 살펴봤습니다.


PVOID EncodePointer(
PVOID Ptr
);

PVOID DecodePointer(
PVOID Ptr
);

PVOID DecodeSystemPointer(
PVOID Ptr
);

PVOID EncodeSystemPointer(
PVOID Ptr
);



이 함수들은 kernel32.dll 에 구현되어있는데 코드를 디스어셈블해서 보면 En/DecodeSystemPointer() 함수의 경우 시스템 전역적으로 고정적인 값으로 포인터를 XOR 하지만 En/DecodePointer() 함수는 프로세스마다 다른 값을 통해 XOR 을 합니다.
MSDN 에도 나와있듯이 En/DecodePointer() 가 비교적 더 안전하다고 볼 수 있겠죠. (포인터 인코딩 자체에 대해서 부정적인 생각을 가진분들은 빼고요. ^^)

호출 흐름은 kernel32.dll::EncodePointer() -> ntdll:RtlEncodePointer() 입니다.



RtlEncodePointer() 함수는 ZwQueryInformationProcess() 함수를 통해 얻는 4바이트 짜리값을 통해 XOR 을 하는 매우 간단한 코드이군요. ZwQueryInformationProcess() 를 호출하는 것으로 보아 프로세스에 의존적인 값을 이용한다는 것을 짐작할 수 있겠군요.


ZwQueryInformationProcess(
GetCurrentProcessId(),
0x24,
&value // sizeof(value) = 4
4,
0)



(WinDbg 의 scratch pad 에서 복사해서 붙이려는데 지저분하게 붙어서.. -_-;; 앞부분만 이미지 캡쳐로.. ㅋㅋ)

결국 위의 코드는 NtQueryInformationProcess() 를 호출하게 되겠죠.
NtQueryInformationProcess()를 리버싱해보면 현재 프로세스의 EPROCESS::Cookie 값이 없는 경우 현재 시간값을 구하고, 뭔가 다른 필드들과 xor 연산을 통해 유니크한 값을 만들어 내어 Cookie 값을 생성해서 세팅하고, 리턴을 합니다.

물론 Cookie 가 이미 만들어져 있는 경우는 그냥 리턴하는 것이죠.
즉 EPROCESS::Cookie 값은 프로세스에 고유한 값이 필요할때 쓰이는 값이란 것입니다. :-)


결론:
  EncodePointer(), DecodePointer() 함수는 진짜로 (거짓말 아니고-_-) 프로세스에 유니크한 값을 통해 포인터를 뭉개준다!!

  EPROCESS::Cookie 값은 프로세스에 유니크한 값이 필요할때 가져다 쓸 수 있다!!
by somma | 2008/09/04 09:44 | 시스템 프로그래밍 | 트랙백(2) | 덧글(18)
트랙백 주소 : http://somma.egloos.com/tb/3891138
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from Woof's at 2008/09/17 13:59

제목 : EncodePointer 함수 사용.
http://somma.egloos.com/3891138 재미난 함수를 봐서 사용해봤습니다. 위의 링크를 가보시면 분석에 대한 부분을 보실 수 있습니다. 대부분의 정보는 위의 스크린샷에서 잡을 수 있을 거 같네요. :) 위에 보면 연속해서 Encode, Decode를 할 경우 새로 키값을 생성하는 걸 알 수 있는데, 다음에 시간이 되면 EPROCESS 내부의 Cookie라는 녀석이 어떻게 변화하고 함수가 돌아가는 모습도 한 번 살펴보고 싶네요.......more

Tracked from Woof's at 2008/10/06 14:22

제목 : Vista의 EncodePointer의 키 생성.
한 동안 밍기적거리다가 생각이 나서 비스타 이미지를 받아서 돌려보았습니다. 여전히 Cookie는 변동없이 하나만 주어집니다. 다만 RtlEncodePointer와 RtlDecodePointer의 함수가 조금 변형이 되어 있네요. :| 처음보는 명령어라 뭘까?하고 살펴보았네요. ( or는 or인데 'R' or가 뭐지!? 하고 무식한 티를 잠깐 냈습니다.) 핵심은 ror 이군요. ror은 RCL, RCR, ROL, ROR 류의 Rotate 명령어 ......more

Commented by jiman at 2008/09/04 17:55
오우 굿 -_-b

좋은거 하나 배워갑니다.^^
Commented by somma at 2008/09/05 13:32
오전에 승현이랑 얘기했는데, 낼 모레 간다면서 ?
오덕후들의 총 본산에 진출하는것을 축하축하~~~

ps. 전신 미녀 프린트 베게 사서 회사로 보내라. -_-
Commented by vbdream at 2008/09/04 20:47
새로운 사실이네요 ^^. NULL pointer (0x00000000L)을 encode해서 식별값을 얻어서 적절히 쓰면 좋겠네요.
Commented by somma at 2008/09/05 13:33
전 포인터 인코딩보단.. EPROCESS::Cookie 가 뭔지 알게되었네요..
Commented by kkamagui at 2008/09/05 07:56
와아~ 멋집니다. ^^
좋은 글 잘 보고 갑니다. ^^
Commented by somma at 2008/09/05 13:35
kkamagui 님이 더 멋지심다. *^.^*
Commented by 이재학 at 2008/09/06 13:30
아이쒸~
이게 다 먼 소리여..
에이.. 진짜..이노무 보안쟁이들은 너무 어려운거해..
ㅋㅋ
Commented by somma at 2008/09/08 18:56
ㅋㅋㅋㅋ
DB 쟁이들두 뭔소리하는지 모르거써~ ㅋㅋㅋ
Commented by 이아우 at 2008/09/07 14:31
이런게 있군요...
좋은거 배워갑니다. :D
Commented by somma at 2008/09/08 18:57
:-)
Commented by masterdoby at 2008/09/12 16:28
ㅎㅎ~~~ 요즘 재미있는 포스팅 잘 보고 있습니다^^;;
힘내세요!!
Commented by somma at 2008/09/15 09:48
:-) 감사합니다.~
Commented at 2008/09/12 16:28
비공개 덧글입니다.
Commented by Woof at 2008/09/17 12:24
뒤늦게 봤네요. RSS reader가 엉망이라.
근데 저 함수를 어떤 용도로 쓰지? 라고 생각하면서 남기다가 .를 찍기 전에 아하! 했습니다.
좋네요. :)
잘지내시나..
Commented by Woof at 2008/09/18 03:35
XP_SP2하고 Vista하고 돌아가는게 틀리네요. 구경 한번 하려고 XP_SP2 VM 띄워서 돌리는데 결과값이 틀려서 '어 뭐야뭐야' 했네요. ;
지금 (한국 시간 새벽 3시 30분) 맨유 경기 보고 비스타 이미지 MS에서 뿌리나 확인해봐야 할듯. :)
Commented by zeratul at 2008/10/28 13:16
이번 세미나 기대하고 있답니다..

좋은내용 감사합니다.

From Zeratul
Commented by somma at 2008/10/28 21:56
에구에구.. 기대하심 안되요.
시간을 좀 내서 준비를 착실히 해야 할텐데 영...시간이 안나네요. ㅜ.ㅜ
저때문에 세미나 망칠지도.. ㅎㅎㅎ
Commented by Dual at 2008/11/06 16:35
흐음, Cookie 값 대역이 어떻게 되는지가 관건일꺼 같네요,
공격자 입장에서 Cookie값의 대역이 크지 않다면,
xor 하는 방식 자체는 디스어셈블을 통해서 얻을 수 있으니 흠,
실제로 xor을 할때 사용되는 변수가 Cookie 외에 다른것이 있는지 확인을 해봐야 겠네요 :-O

:         :

:

비공개 덧글



< 이전페이지 다음페이지 >