목록Reversing (20)
kaka09
[사진]1-1 정답은 무엇인가라는 심플한 메세지만 주어졌다. 심플하게 올리 디버거로 까보자 [사진]1-2 응?? 올리디버거로 열 수 없다는 에러메세지를 보여준다.. 뭐지 싶어서 혹시 이상한 종류의 패킹인가 싶어 PEID로 확인해 보았다. [사진]1-3 PEID로 확인해본 결과 C#으로 만들어진 프로그램임을 확인 할수 있었다. 구글링을 찾아보니 C# 같은 경우는 일반 PE 파일구조와는 달라 올리 디버거로 실행시키기 어렵다고 한다. 따라서 C#전용 디컴파일러를 사용해야 한다는데, C#도 자버처럼 중간언어로 변환 시키는 과정이 존재해 디컴파일로 원본 소스에 가깝게 복원이 가능하다고 한다. jetbrain 의 dotpeek을 이용하여 디컴파일을 시도하였다. [사진]1-4 디컴파일로 원본 소스코드를 복원한 결과이..
[사진]1-1 이번 문제는 특정 key값을 구한 다음 성공메세지를 키값으로 변경시킬수 있는지 물어보는 문제다. 즉 키값과 성공메세지 부분을 찾아야 한다. 올리 디버거로 해당 문제를 디버깅 해보자 [사진]1-2 올리 디버거로 살펴본 결과 하단 부분에 "In the Bin" "Congraturation~" 문자열을 볼 수 있다. 키값만 찾으면 해당 문자열을 덮어 씌우면 된다. 문제는 키값인데 키값은 생각보다 어렵지 않게 찾을 수 있다. 바로 CMP EAX, 7A2896BF 구문인데 비교문이 일치하면 밑에 성공메세지를 출력하는 영역으로 분기한다. [사진]1-3 7A2896BF를 10진수로 바꾸면 2049480383이다. 10진수로 변환한 값을 넣어야 제대로 비교가 되고 참고로 해당 문제에서는 숫자 이외의 값은..
[사진]1-1 이번 문제도 OEP를 언급하는것으로 보아 패킹된 프로그램임을 알 수 있다. 왠지 앞으로는 계속 패킹된 문제들만 제공할듯?? 아무튼 이번 문제에서는 예전에 풀어봤던 문제인 StolenByte를 찾는 문제이다. 먼저 PEID를 사용하여 어떤 패킹 알고리즘을 사용하였는지 확인해 보자 [사진]1-2 PEID로 확인결과 UPX로 퍠킹이 되었음을 확인할 수 있다. 이번엔 따로 언패킹을 시도하지 않고 바로 올리 디버거를 이용해 풀이를 시도해보았다. [사진]1-3 9번 문제와 똑같은 느낌이 난다.. 참조하는 문자열도 말이고.. 혹시나 싶어서 한번 실행을 시켜 보았다. [사진]1-4 9번문제와 완전 똑같은 문제다.. StolenByte 찾는 문제도 똑같고 단순히 OEP만 추가 되었는데.. 조금 풀어보다 왜..
[사진]1-1 OEP를 언급하는것을 보아 해당 문제또한 패킹이 되어 있는 문제인것 같다. 이전 문제들과 똑같이 upx.exe를 이용하여 언팩을 시도하였으나.. [사진]1-2 upx로 패킹된 프로그램이 아니라고 한다.. 그래서 PEID 라는 툴을 사용하여 해당 문제가 어떠한 알고리즘으로 패킹 되었는지 확인하였다. [사진]1-3 PEID로 확인결과 ASPack 이라는 알고리즘으로 패킹이 된 것을 확인할 수 있다. 나중에 따로 upx나 ASPack의 차이점 그리고 패킹 과정에 대해서도 포스팅을 다뤄야 겠다. 지금은 문제풀이에 집중 하자.. [사진]1-4 직접 올리 디버거로 디버깅 해본 결과 UPX 알고리즘 처럼 ASPack도 PUSHAD->POPAD으로 거치는 과정은 비슷했다. 다만 해당 해당 문제에서는 JM..
[사진]1-1 StolenByte?? 를 찾아보라는 문제이다. StolenByte를 처음 들어 봤기에 구글링을 통해 알아보았다. StolenByte란 훔친 바이트를 의미한다. 패킹된 프로그램에서 특정 부분의 코드를 다른 부분으로 옮겨진 코드이다. 주로 엔트리 포인트에서 이용된다. OEP로 점프하기 전에 PUSH 되는것이 특징이라 할 수 있다. 정말로 그런지 올리 디버거를 통해 확인해 보자 [사진]1-2 패킹이 된 프로그램이라 POPAD 부분을 찾았고, 그 밑에 PUSH되는 인자 3개가 존재한다. 특히 2개의 문자열 인자를 살펴보면 무언가 경고창 같은거에 담겨질 메세지처럼 보인다. 그런데 OEP에 진입하지도 않았는데 이러한 인자들이 PUSH가 되었다는 것이 의심이 되는 상황이다. 일단 한번 프로그램을 실행..
[사진]1-1 OEP 코드를 찾으라는 것으로 보아 해당 문제는 패킹되어 있는 문제임을 알 수 있다. 올리 디버거로 해당문제를 디버깅 해보자 [사진]1-2 처음 명령어가 PUSHAD임을 봐서 패킹된 프로그램임을 단번에 알 수 있다. 처음에 PUSHAD로 시작하면 반대로 POPAD로 끝나는 부분이 있다. 해당부븐에 어딘가로 jmp 하는 구문이 있는데 거기가 바로 OEP 코드라고 할 수 있다. [사진]1-3 POPAD 밑에 jmp 08.01012475 부분이 있는데 여기가 바로 OEP이다
[사진] 1-1 해당 문제는 C드라이브의 이름을 CodeEngn 으로 바꿨을때 시리얼이 어떻게 변하는지를 묻는 문제다. C드라이브를 바꾸기전에 생성되는 시리얼 값을 분석해보자 [사진] 1-2 004010d0 영역에 있는 DialogBoxParamA 함수에 의해 생성된 입력창에 AAAA를 입력하면 [사진]1-2 처럼 String2에 AAAA가 들어간다. 그리고 밑에 있는 String1 영역에 시리얼 값처럼 보이는걸 확인 할 수 있다. 밑에 IstrcmpiA 라는 문자열 비교함수를 실행시키는 것을 미루어 보아 문자열이 서로 일치하는지 비교하는 함수인것 같다. [사진] 1-3 그대로 값을 넣어보고 실행하면 [사진]1-3 처럼 시리얼 값이 틀리다는 경고창이 출력 된다. 그럼 이제 String1에 들어있는 값을 ..
[사진]1-1 이번 문제는 unpack을 먼저 시도하라고 문제에서 친절하게 알려준다. 특정 시리얼 번호와 OEP 코드를 찾으라는건데 리버싱을 처음 접해보았기 때문에 OEP 코드가 무엇인지 검색을 해봤다. 검색 결과 OEP(Original Entry Point) 코드는 패킹된 프로그램을 실행할때 원본 코드를 실행시키기 위하여 원본코드가 존재하는곳으로 분기하는 코드를 말하는 것 같다. 프로그램이 패킹이되면서 여러 정보들로 덮어쓰워지는?데 프로그램이 정상적으로 실행되기 위해서는 패킹된 정보들을 풀고 원래의 정보들(원본 소스코드 포함)을 가리켜서 실행시키는 구간이 있는데 이를 OEP라고 하는것 같다. 정확히 맞는 개념이 아닐 수도 있지만 일단은 흐름상 이렇다라는걸 알아두고 추후 다시 공부해보도록 해야겠다.. O..
[사진] 1-1 해당 문제는 주어진 프로그램에서 등록키를 찾아보라는 문제 같으니 한번 프로그램을 실행시켜 보자 [사진] 1-2 프로그램을 실행시켜 보니 어떠한 키값을 입력해서 인증을 해야하는 프로그램처럼 보였다. 키값을 통해 인증을 한다는 것은 바이너리 내부에 인증과 관련된 키값이 존재할테고 그 키값을 입력하면 문제를 풀 수 있을것 같았다. 그러므로 디버거를 이용해 까보자 [사진] 1-3 디버거를 이용해 바이너리를 열어보면 경고창이 하나 뜬 다음 조금 이상한? 바이너리들이 보여진다.. 인터넷으로 검색해본 결과 패킹 되어 있는 바이너리이다. 따라서 언패킹을 시켜줘야 한다. 사용된 툴은 peid와 upx.exe 파일을 사용하였다. [사진] 1-4 먼저 PEID를 이용하여 바이너리가 어떤걸로 패킹이 되었는지 ..
[사진] 4-1 디버거를 탐지하는 함수의 이름을 찾아야 한다. 우선 프로그램을 실행시켜 보자 [사진] 4-2 프로그램의 실행결과 [사진]4-2 에서 보여지는 바와 같이 정상이라는 문구가 계속 출력되는것을 확인할 수 있다. 이제부터 ollydbg를 이용하여 프로그램을 분석해 보자 [사진] 4-3 프로그램을 쭈욱 실행하다보면 특정 함수를 call 하면서 "디버깅 당함" 이라는 메세지를 계속 출력한다. 해당 메세지를 출력하는 부분을 ollydbg로 찾아 보면 다음과 같다. [사진] 4-400401048 MOV ESI, ESP 에서부터 반복루틴이 실행되면서 디버깅을 당하는지 아닌지의 여부를 판단한다. 디버깅 탐지의 여부는 KERNEL32.IsDebuggerPresent 함수를 호출하면서 리턴 값이 1이면 디버깅..