본문 바로가기

리버싱

(11)
About process hollowing process hollowing (프로세스 할로윙)은, 악성코드가 탐지를 회피하기 위해 사용하는 방법으로, 탐지 솔루션이 well known process는 검사를 하지 않는 점을 이용하였다. 탐지 솔루션은 다음과 같은 구조로 설계 되었다고 추측한다. 실제 탐지 솔루션의 코드를 볼 수는 없었기 때문에, 순수히 추측을 통해서 만든 자료임을 참고 해 주었으면 한다. Well known은 explorer, winlogon같은 process가 존재하고 Unknown은 DB에 없는 process나, cmd와 같이 악용 가능한 process가 검사목록에 존재한다고 가정한다. 다음과 같이, 검사 대상이 비 검사 대상을 실행하는 구조일때, 비 검사 대상은 당연히 검사 목록에서 제외된다. 이 점을 이용하여 솔루션의 감시..
해킹의 방어에 대한 개인적인 생각 해킹을 위해서 3가지의 조건이 필요하다. 1. 가치 2. 접근성 3. 지속성 가치는, 해킹의 목적이 해커에게 가치 있어야 한다. 접근성은, 지속적인 해킹 시도를 가능하게 해준다. 이는 해킹에 있어서 매우 중요한 요소이다. 여러가지 인자값, 환경에서 많은 시도 이후 성공해내는게 해킹이기 때문이다. 지속성은 가치와 접근성이 지속적인가에 초점이 있다. 해킹에 성공했다고 하더라도 해당정보가 10초만에 가치가 사라지거나, 접근되는 정보가 매번 바뀐다면 해커는 해킹에 흥미를 잃게 될 것이다. 이로써 해킹이라는 행위 이전에 해커또한 사람이라는 점을 이용하여 방어하는 방법의 잠재성을 알 수 있다. 기술적으로 아무리 아름답게 막더라도, 결국 시간이 지나면 해커는 우아하게 보란듯이 해킹한다. 하지만 해커라는 사람을 기만한..
64비트 프로세스 은닉 성공적으로 은폐된 프로세스의 모습!! 작업관리자에 서술되는 프로세스의 은닉을 위해서 2개의 과정이 필요했다. 1. code injection 2. 64bit WINAPI hooking 1번같은 경우 32비트와 호환되는 부분이 상당히 많아서 쉽게 성과를 내었지만, 2번같은경우 유감스럽게도 자료가 없다시피하여, 직접 삽질했다. 삽질결과 다음 결론에 도달했다. JMP instruction의 relative address는 32비트에선 후킹시 유효했지만, 64비트에선 후킹시 유효하지않다. 이유는 상위 4바이트 때문인데, 상위4바이트는 모듈마다 달라지지만 상대주소로 JMP를 진행했을시 상위4바이트는 JMP instruction이 존재하는 모듈을 따라간다. 따라서 간접호출을 통하여 JMP instruction을 진..
reversing.kr (Replace.exe) 이런 바이너리가 주어진다. WINAPI에 BreakPoint를 설치해보면 다음과 같이 나온다. 0040106C의 JMP를 따라가면 다음 코드가 나오는데, 00401071로 다시 점프함을 알수있다. F9으로 쭉 실행시키면 예외가 발생되는데, [eax]주소에 nop을 설치하려다 예외가 발생되어서 실행이 멈추어진것이다. 정리해보면, 00401071주소의 Jmp를 nop으로 만들어서 Correct문자열을 출력시키면 되는것이다. eax의 값를 보면 다음과 같이 나왔다. 입력은 1234였고, inc명령을 통해서 + 1이 진행되는걸 알고있다. 0을 기준으로 계산하면 어떤식으로 계산하는지 빠르게 알수있을것같다. -1을 넣어야하는데, 음수를 받지않으니 16진수로 FFFFFFFF -> 4294967295를 넣는다. +1을..
reversing.kr (Music_Player.exe) 이런 모습의 바이너리가 제공되는데, MP3 Player는 1분이상 음악을 실행하지않는다. 1분 이상으로 음악을 실행시키는게 목적이다. 59초에서, MessageBox API를 사용하여 사용자에게 더이상 못듣는다고 알려주는데 해당 API를 검색한 이후, ret을 반복시켜서 원본코드로 진입하면 다음과 같은 코드가 나온다. 분기문이 보인다. cmp eax, 0xEA60 60000 밀리세컨드만큼 비교를 진행하고있으며, jl (Jump Less)일경우에만 음악을 실행하고 있다 그렇기때문에, Jl -> Jmp로 바꾸고 실행하였지만 중간에 에러가 뜬다. 음악을 실행하는 루틴에 존재하는 모든 분기문에 BreakPoint를 설치해보았다. 그리고 F8을 반복해서, 정상적인 실행이 확인되는 부분의 BreakPoint를 제거..
reversing.kr (Easy_UnpackMe.exe) StepOver를 반복하면 OEP가 나온다. 원본 어셈블리의 모습
reversing.kr (Easy_KeygenMe.exe) Name, Serial을 입력받고, 인증을 진행하는 바이너리이다. 어셈블리를 분석한결과는 다음과 같다. 첫번째 입력에 따라서 시리얼이 바뀐다. ‘asd’를 첫번째 입력했을때, 함수내부에서 ‘asd’에 대응하는 시리얼을 만든다. 그리고 ‘asd’에 대응하는 시리얼이 입력되었는지 검증한다음 성공여부로 분기한다. ‘asd‘에 대응하는 시리얼은 715354이다. 715354를 입력했을때, Correct문자열이 나왔다. 하지만 문제에서는 Serial에 대응하는 Name을 요구하고 있다. 어셈블리를 분석해서 만들어낸 코드이다. 컴파일 후에 입력을 진행했을때, Name은 다음과 같았다.
reversing.kr (Easy_CrackMe.exe) BreackPoint를 걸어놓고, Ctrl + F2를 통해서 재실행한다음 분석을 진행한다. 정확히 인증루틴이 나온다. 인증루틴 위의 어셈블리를 분석해서 풀었다.