요즘 보안쪽 논문을 보면, 생각했던것과 많이 달라 이쪽 대학원을 가야하나 말아야하나 망설여지지만, 그중 이 논문은 가장 괜찮았다.


Smashing the Gadgets: Hindering Return-Oriented Programming Using In-Place Code Randomization


ROP gadget을 없애는 방법을 제시하고있는데, 그중 가장 기억에 남는건 첫번째 방법인 Atomic Instruction Substitution이다.


linux계열을 ROP로 공격할땐, 별로 소용이 없을것 같긴 하지만,

windows계열에서는 꽤나 도움이 될듯하다.


이 논문에서 예를 든건


cmp al,bl 과 같은것들을 cmp bl,al로 바꿈으로써, ret(C3)를 없앤다는 내용이다.

의미상으로는 전혀 다른게 없지만, ret이 없어짐으로써 가젯으로는 소용이 없어졌다.

속도상의 손해도 거의 없을것 같다.


사실 이방법만으로는 가젯파괴가 많이 힘들지도 모르지만, 

단순한 아이디어치고는 상당히 괜찮은것 같다.

posted by tunz
  • hea 2013.11.17 22:54

    안녕하세요 tunz님 rop공부하다가 의문점이 생겨 질문드립니다.
    rop시 got overwrite를 하면서 add 가젯을 써주던데 add가젯이 정확히 어느용도인지 이해가 안되더라구요..
    페이로드 인사이드를 보면 9쪽에 offset을 ecx에 로드하고 ecx는 add가젯을 통해 ebp+0x5b042464와 더해진 뒤 execve()의 주소를 printf@GOT에 써준다는데 이부분좀 자세히좀 풀어서 설명해주실수 있을련지요..

    • tunz 2013.11.17 23:59 신고

      ROP라는게 ret을 이용한 프로그래밍이라는 뜻입니다.
      GOT에서 printf의 주소를 덮어 쓰는 방법은 여러가지가 있는데,
      send,recv 함수등이 바이너리 안에서 사용되었다면, send로 printf의 주소를 익스플로잇쪽에 보내고 더한후에 recv함수로 printf의 주소를 덮어 주는 방법등으로 간단하게 할수도 있지만,
      이런방법이 불가능 하다면, print GOT의 주소를 eax에 어떻게든 넣어서 (pop eax; ret; 등을 이용해서) add [eax], ebx; ret; 이라는 가젯이 있다면, ebx또한 마찬가지로 조작한후, 위의 가젯을 이용하면 printf GOT의 주소를 조작할수 있습니다.
      보기좋게 add [eax], ebx; 와 같은 간단한 가젯이 있으면 좋겠지만, 만약 저런게 없고, add [eax + 0x123123] , ebx;라는 가젯이 대신 있을경우에도, eax를 (printf GOT - 0x123123)으로 맞춰주면 같은 작업을 할수있습니다.