revering-SEH 안티디버깅을 우회
엄청 오랫만인것 같습니다. 리버싱 관련 포스팅은...
reversing.kr 문제를 좀 풀고 문제를 푼지 한 반년?? 되었는데 문제를 접하니 엄청 못해졌습니다. 그런중 과제를 하다가 SEH로 안티디버깅을 하는 재미있는문제가 있어서 간단히 포스팅해보곘습니다.
SEH는 단순히 예외 처리 핸들러입니다.
exception handler를 PUSH하고 있음-단 이걸 PUSH한다고 해서 무조건 SEH를 이용해서 안티디비겅을 한다고는 볼 수 없다. (대부분 PUSH)
IDA를 사용하는 가장 큰이유는 Hex Ray입니다. 근데 핵스레이로 소스좀 보려했는데 자꾸 안되더군여.... 계속 내려서 찾아보니 쓰레기 코드가 있었습니다. 이 코드는 일부러 에러를 일으켜서, 즉 예외를 일으켜서 exception쪽으로 가도록 하는 안티디버깅을 수행하고있었습니다.
한줄씩 봐야지 눈치채지 그냥 f9 누르거나 핵스레이만 하려하면 낭패본다는 것을 다시한번 꺠닳았습니다.
이렇게 강제적으로 예외를 일으킵니다.
NOP코드로 바꾸어 주었습니다. (olly 에서 바꿨음 IDA는 너무 복잡...저에게는 hex ray용..)
이 부분이 문제의 실질적인 연산부분입니다. hex ray가 가능해지니 IDA와 olly두가지를 잘 이용했더니 쉽게 연산 부분을 찾을 수가 있었습니다.
저 부분의 어셈이 어려우신 분들을 위해 주석을 달아놨습니다.
숫자가 굉장히 크기 때문에, 물론 연산을 하려면 할 수있지만 z3를 편하게 이용했습니다. z3는 파이썬에서 제공해주는 라이브러리로 큰수의 연산을 할때 방정식을 자동으로 풀어주는 라이브러리 도구입니다.
이 문제를 풀때 처음 설치해봤는데, 유명한 라이브러리가 아니여서 그런지 설치하는데 애좀 먹었습니다.
성공!!!
여기서 중요한 것은 요새 나오는 대부분의 문제가 hex ray가 한번에 되지 않는 경우가 많은데 이런경우 코드 중간에 쓰레기값을 넣어 IDA가 핵스레이하는 것을 방해하기 떄문입니다. 따라서 이렇게 코드를 찾아 nop으로 바꿔주거나 정상적으로 고쳐주는 것을 알아야하고,
강제적으로 예외를 일으켜 정상적인 코드의 흐름이 아닌 예외 발생시 이동하는 부분으로 가서 디버깅을 방해하는 방식도 쓰일 수 있다는 것입니다.
0 개의 댓글