CodeEngn Challenges : Basic 06 문제 풀이

안녕하세요 테라트입니다


6번 풀이 시작합니다~


URL : https://codeengn.com/challenges/basic/06




문제 입니다!


OEP란? Original Entry Point의 약자로서, 본래 프로그램이 시작하는 위치를 의미



늘 하는 일!


프로그램 동적 분석입니다 ㅋㅋ 어떻게 동작하는지 어떤 메시지를 내는지


확인해보겠습니다



시리얼 키를 입력한 후에 'Check Serial'을 누르는 것 같습니다



아무거나 입력 후 'Check Serial' 버튼을 누르니


'Wrong serial!!!' 이라고 하네요,,



저희가 좋아하는 올리로 확인해봅시다 ㅋㅋ


엥? 그런데 올리에 올리려고 보면?



압축된 코드 같은데 계속 분석할거냐고 물어봅니다


아~ Unpack을 해서 OEP를 찾으라고 했으니 패킹이 되어있는 상태겠군요


그래서 올리디버거에서 이를 감지하고 경고를 주는 것 같습니다


확인하기 전에 어떤 패커로 패킹이 되있는지 확인해보겠습니다!!



저희가 잘 아는 UPX 패커로 패킹이 되어 있음을 확인했습니다 ㅎ


UPX 패커를 이용해 언패킹을 진행하셔도 되지만


이번에는 MUP라는 것을 진행해보려 합니다



MUP란? Manual UnPacking의 약자로 패커 프로그램을 이용하여 언패킹하지 않고 수동으로 OEP를 찾아 언패킹을 하는 작업을 의미






UPX 패킹의 특징


PUSHAD를 통해 Register의 값을 STACK에 저장한다


언패킹이 끝난 후에는 POPAD를 통해 STACK에서 Register의 값을 가져온다




잘 따라오세요!


F8을 통해 한번 진행해주시고


ESP 주소로 향해보겠습니다



왼쪽 하단의 덤프 창에 ESP가 가지고 있던 주소값이 잘 잡혔으면


Hardware 브레이크 포인트를 걸어줍니다



그리고 Ctrl + F2를 눌러 초기화를 하고


F9를 눌러서 브레이크 포인트가 설정된 곳까지 진행을 해줍니다


그러면 다음의 부분에 걸리게 됩니다


스크롤을 올려보면 POPAD가 보이실겁니다 ㅋㅋ


저희는 거기를 볼 것이 아니고-



밑에 보면 JMP문이 보입니다!


저기를 클릭 후 Enter를 누르면



다음과 같이


PUSH EBP

MOV EBP, ESP

로 시작하는


진정한 프로그램의 시작위치인 OEP를 찾을 수 있습니다!



PUSH EBP 에서 Ctrl + * 을 눌러주시면


그 위치로 진행 부분이 이동하게 됩니다 ㅎㅎ


자 이제 문제를 풀어볼까요??


아 맞다 문제에서 OEP를 찾으라고 했으니


메모해둡니다... '00401360'


다음으로-



패킹이 풀린 상태이니, 이 프로그램에서 쓰인 함수들 목록을 보는 기능을 사용해서 확인해보도록하겠습니다


'All intermodular calls' 고고



'MessageBox',,?


메시지 창을 띄워주는 API 같은 느낌이 들죠? 그쪽 함수로 가서 확인해보겠습니다


가보니 동적 분석때 봤던 문구들이 눈에 띔을 확인할 수 있습니다



'ERROR Wrong Serial!!!' 보이시죠?



추측해보면 JNZ 점프문에서 플래그 값에 따라


'Good Job' 으로 넘어갈지 'Error'로 넘어갈지 결정되는 것 같습니다!



그 위에 보면 ASCII 문자열이 보입니다 저 문자열을 스택에 넣어서


함수를 호출 한뒤 비교해서 플래그 값이 정해지면 JNZ 점프문에서 어디로 분기할지 결정하는 것 같습니다


그럼 저기 보이는 문자열이 프로그램의 정답이지 않을까요?



해보면 되죠-



맞네요- ㅋㅋㅋㅋㅋ


그럼 CodeEngn의 정답은?


OEP 주소값과 프로그램의 정답을 이어붙인 답이 되겠네요!



짜잔?


맞습니당!




다음 전공 컨텐츠는 06.exe 프로그램을 Import REC 프로그램을 통해 언패킹 된 프로그램으로 만드는 방법을 써보려고 합니다


화이팅! 저도 열심히 공부중입니다-


댓글, 0

테라트

Since 2018.07.03 / IT 관련 정보, 일상의 공유를 위한 블로그