int $0x80

Control Flow Integrity 정리 본문

해킹공부/시스템 해킹

Control Flow Integrity 정리

cd80 cd80 2015.06.22 21:52

CFI CFG가 작년에 이슈길래 들어는 봤었는데 ROP를 막을수 있는 기법이라고 해서

막연히 어렵게만 생각하다가 문제를 출제할일이 생기면서 CFI가 적용된 문제를 내면 재밌을것 같아서 조금 찾아봤는데 생각보다 엄청쉽다

논문까지 볼 시간은 없어서 옛날에 스크랩해둔 박세준님의 블로그 글을 다시 읽어봤다

https://www.bpak.org/blog/research/

위 링크의 Poor Man's Control Flow Integrity 를 읽으면된다

원문도 워낙 간단명료하게 설명되있지만

영어 문장이 세문장이상을 넘어가면 현기증을 느끼는 사람들을 위해 간단히 정리하자면

(Control Flow Integrity와 Control Flow Guard에 대한 정리가 아니라 Poor Man's Control Flow integrity에 대한 정리이다)

CALL_TAG와 RET_TAG가 있고 call과 ret전에 TAG verification 절차가 추가된다


CFI 적용전에 코드가 아래와 같다면 ( 아래 코드가 문법에 맞는진 모르겠다 )

main:

push ebp

mov ebp, esp

push 3

push 5

call add

add esp, 8

push eax

push $fmt

call printf

add esp, 8

add:

mov dword ptr [ ebp + 4 ], eax

add eax, dword ptr [ ebp + 8 ]

ret

fmt db "5+3 = %d\n", 0

이 코드는 CFI가 적용되지 않은 상태이다

물론 취약점도 없는 코드지만 CFI자체에 대한 설명을 위한것이니 넘어간다

이 코드에 PMCFG를 적용시키고 원문에서 사용한 태그와 똑같은 태그를 적용시킨다고 하면

ret과 call 인스트럭션 전에 각각 CALL_TAG와 RET_TAG에 대한 validation 코드가 추가된다


main:

[CALL_TAG]

push ebp

mov ebp, esp

push 3

push 5

[CALL_TAG validation for add()]

call add

[RET_TAG]

add esp, 8

push eax

push $fmt

[CALL_TAG vaildation for printf()]

call printf

[RET_TAG]

add esp, 8

leave

[RET_TAG validation]

ret

add:

[CALL_TAG]

mov dword ptr [ ebp + 4 ], eax

add eax, dword ptr [ ebp + 8 ]

[RET_TAG validation]

ret

fmt db "5+3 = %d\n", 0


이 기법은 쉘코드를 사용할 수 있는 non NX 환경에서는 쓸모가 없지만

ROP를 써야할 경우엔 조금만 생각해봐도 충분히 효과가 있는 방법이고

자세히 보진 않았지만 CFG를 다룬 발표들에서도 CFG가 적용되지 않은 이미지를 이용해서 우회하는 방법만 소개하는걸 보면

효과가 좋은 방법은 맞는것 같다


for further reading: ( 계속 보게 된다면 좋은거 볼때마다 업데이트 )

http://www.powerofcommunity.net/poc2014/mj0011.pdf

신고

'해킹공부 > 시스템 해킹' 카테고리의 다른 글

ARM exploit 자료 추천  (0) 2015.07.06
RTL을 사용한 최초의 exploit  (0) 2015.07.01
Control Flow Integrity 정리  (0) 2015.06.22
0 Comments
댓글쓰기 폼