본문 바로가기

리버스엔지니어링

레지스터 정리 리버싱을 하기 위해서는 먼저 어셈블리어를 배워야 하는데 IA-32플랫폼에서 쓰이는 어셈블리어에서 많이 쓰는 레지스터에 대해서 설명드리겠습니다. 레지스터는 알기 쉽게 c언어에서 변수를 선언한다고 보시면 됩니다. 하지만 c언어와의 차이점은 c언어는 자신이 원할때 변수를 맘대로 생성시킬 수 있는 반면에 어셈블리어는 이미 몇개의 레지스터의 갯수로 정해져있다는 점입니다. 다음 그림은 Basic program execution registers 그룹에 포함된 전체 레지스터 정리 그림입니다. 가장 위는 범용레지스터, 왼쪽아래의 EIP는 Instruction pointer, 그 아래의 EFLAGS는 프로그램 상태와 컨트롤 레지스터, 그 오른쪽은 세그먼트 레지스터입니다. 1)범용레지스터 범용레지스터는 이름 그대로 범용적.. 더보기
upx 언팩 드디어 upx 언팩 방법을 쓰는군요. 동아리 활동+ 시험기간이 다가오느라 블로그를 굉장히 오랬동안 못써서 미안해야 되지만 아직 시험기간이므로 5월달 되야지 다음글 쓸것같네요. ※너무 어렵고 귀찮다 싶으면 크고 강렬하게 색칠한 제목부분만 보고 맨 밑의 요약으로 내려가세요. ↓ 도입 저번 코드엔진 L06 파일의 언팩을 안한 상태로 디버거를 실행시키면 004298F0에서 pushad라는 명령어로 upx언팩부분이 시작됩니다. 그냥 코드를 쭉 읽어보면 mov esi,386D13B0.00424000 lea edi,dword ptr ds : [esi+FFFDD000] …… jmp short 386D13B0.00429912 이렇게 되있는데요 386D13B0은 파일 이름이니 빼면 1) esi레지스터에 00424000이라.. 더보기
CodeEngn Basic RCE L06 문제 풀이 원래는 이번에 패킹에 대해서 포스팅하기로 했으나 L06을 보니까 또다시 패킹이 되있는 프로그램이라 한번에 쓸려고 바로 L06분석으로 들어갑니다. L06의 문제를 보시고 프로그램을 다운받고 실행시키시면 이런 창이 뜹니다. 시리얼 넘버를 입력해서 실패하면 Wrong serial!!!이라고 뜨고 성공하면 왠지 You got it ; 이라고 뜰 것 같군요. 아 참고로 코드엔진 분석할 때 분명이 PEiD부터 쓰라고 했는데 저는 분석글을 쓰는것이고, 아직은 간단한 크랙미풀이라서 악성코드처럼 실행하면 안되는 프로그램은 아니기 때문에 프로그램을 실행시켰습니다. 그리고 실제로 악성코드도 VMware나 Virtual PC등을 이용해서 실행해 동작을 분석합니다. PEiD에 넣어서 분석해보면 문제에서 나와있듯이 패킹이 되있는.. 더보기
코드게이트 2013 바이너리 100분석 코드게이트 바이너리 100점짜리 문제의 모습입니다. 100점짜리 싸구려 도어락이며 참가한 500명 정도의 사람들 중에 250명정도의 사람들에게 뚫린 비운의 도어락입니다. *을 누르면 INPUT PASSWORD라고 뜨고 아무 숫자나 입력해서 *를 누르면 코드가 아니라고 뜹니다. 이제 이 문제는 지금까지 풀던 방법과는 다르게 풀건데요 바로 올리디버거로 파일을 분석하지 않고 PEID로 먼저 분석을 하겠습니다. 위의 그림처럼 분석을 하게 되는데요, 디버거로 먼저 분석을 하지 않는이유는 저번 코드엔진 L05때도 그랬듯이 PEID로 먼저 보면 패킹의 여부등을 미리 알 수 있고요, 어떤 언어로 만들어 졌는지 등을 미리 알면 훨신 더 분석하기가 쉬워지기 때문에 그렇습니다. 좀 위험한 프로그램에서는 디버거로 막 열었다가.. 더보기
CodeEngn Basic RCE L05 문제 풀이 코드게이트 예선전 문제 풀이는 제가 푼데 까지의 방법하고, 본선에 올라가신분들의 풀이법과 함께 풀이를 할것이기 때문에 오늘 9시에 끝났으므로 최대 일주일전에는 풀이법 공개를 해야되므로 그때 문제 풀이를 하겠습니다. 그럼 Reverse L05 시작하겠습니다. 프로그램을 켜보면 맨 위의 그림이 나오고, 아무 키나 누른다음에 Register now! 버튼을 누르면 밑의 에러창이 뜹니다. 그럼 지금까지의 경험을 통해 Wrong Serial,try again문자열을 올리디버거를 이용해서 찾은다음에, 그 주변에 패스워드와 성공시 문자열을 찾으면 되겠죠?? 어머 근데 이게 뭔일일까요?? 이상한 BindCtx라는 문자열빼고는 어떠한 문자열도 보이지 않습니다. 네 이번 문제는 바로 패킹에 대한 지식을 알려주기 위한 문제.. 더보기
CodeEngn Basic RCE L04 문제 풀이 코드엔진 RCE L04 시작하겠습니다. 문제를 보시면 오늘 분석할 프로그램은 디버거 프로그램을 탐지한다고 합니다. 그럼 이 디버거를 탐지하는 함수가 무엇일까요?? 이 함수는 안티디버깅중에 한 방법으로써 리버싱을 계속 하면 잘 알고계셔야 하는 함수입니다. 코드엔진은 그것을 알고서 이번 문제는 안티디버깅 기술에 대한 리버싱실력을 키워주기 위해서 이 문제를 낸 것 같네요. 출처 - MSDN 디버거 프로그램을 탐지하는 함수의 이름은 맨 위에 있는 IsDebuggerPresent 라고 합니다. 뜻을 쭉 해석해보시면 api상태에서 IsDebuggerPresent(void)를 쓰면 프로그램 중간에 디버거를 탐지할수 있다고 합니다. 또한 리턴값으로는 디버거가 작동중이면 0이 아닌값(컴파일러마다 달라요), 디버거가 작동.. 더보기
CodeEngn Basic RCE L03 문제 풀이 코드엔진 Basic RCE L03 시작하겠습니다. 문제를 보면 비주얼베이직에서 스트링 비교함수의 이름을 물어보고 있습니다. 저는 비주얼베이직을 못하므로 다른 사람들의 블로그에서 스트링 비교함수의 이름을 찾아봤습니다. 바로 함수명 ㅁ 라고 합니다. 그럼 문제 끝!!!!.. 입니다만 언제나 말하듯이 문제 푸는것이 다가 아니라 리버싱 실력을 늘리기 위해서 프로그램을 분석해 보겠습니다. 프로그램을 실행해보면 이 두 창이 차례대로 나오는데요 맨 처음메시지의 이름이 Nag라고 되있는 걸로 봐서는 Nag(귀찮게하는)메시지입니다. 두번째 메시지창에는 입력창이 뜨는데요 그냥 아무것이나 집어넣으면 라면서 패스워드가 틀렸다고 합니다. 문제에서 나오는 비주얼베이직에서 스트링비교함수를 물어보는 이유가 바로 여기서 내가 입력한 .. 더보기
CodeEngn Basic RCE L02 문제 풀이 저번 문제였던 L01을 끝내고 이번에는 L02로 넘어가겠습니다. 다음 문제를 푸는 방법은 Continue 부분에 저번 문제의 답을 쓰시면 자동으로 L02의 문제가 나옵니다. 이렇게 L02의 문제가 있는데요 문제를 보니까 실행파일이 손상되어서 실행이 안된다고 합니다. 실제로 눌러서 실행을 시키면 이런 메시지창이 뜨면서 프로그램이 꺼지는데요, 정확히 분석을 할 수는 없어도 16진법으로 된 코드가 나오고, 문제에도 실행파일이 손상되었다고 하는것으로 봐서 OP코드의 f0 00 f0 37 05 부분에 이상이 생겨서 프로그램을 실행시킬수 없다 정도로 생각하시면 될 것 같습니다. 그럼 이것을 올리디버거로 열어볼텐데요 올리디버거로도 에러창이 뜨면서 실행이 안되는 것을 보실수 있습니다. 이 문제는요 리버싱툴중에 하나인 .. 더보기
리버싱 기초를 위한 어셈블리어 오른쪽에 첨부된 pdf파일은 초보자들을 위한 어셈블리어 기초라는 pdf파일입니다. 저또한 이 pdf를 통해 어셈블리어를 공부했고요. 저같은 경우는 segment와 레지스터부터 막혔습니다. 하지만 저는 워낙 책이나 문서를 보는 스타일이 모르는 부분은 넘어가고 전체를 먼저 본다음에 다시 한번 보고 계속 보는 스타일이라서 그냥 글씨가 있다는 것만 보고나서 어셈블리어 명령어를 공부했습니다. 여기 문서에 적혀있는 명령어들과 jmp구문들 정도가 있으면 리버싱을 할 때 흐름을 보진 못해도 각각 명령이 어떤 명령인지 정도는 파악을 할 수 있습니다. 그리고 나서 레지스터,메모리,세그먼트,스택 등에 대해서 공부하면서 프로그램이 어떻게 작동하는지 작동원리를 배우고 나면 안티 디버깅이나 안티 리버싱기술이 없는 프로그램을 분석.. 더보기
CodeEngn Basic RCE L01 문제 풀이 일단 프로그램을 무작정 뜯어보기 전에 프로그램에 대한 설명을 보겠습니다. Korea : 로 써있는 부분에 "HDD(하드디스크)를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가" 라고 써있는데요. 이 GetDriveTypeA라는 함수가 어떤 함수인지 알아보겠습니다. -출처 MSDN 이 함수의 리턴 값에 대한 것인데요 이 프로그램이 실행된 드라이브를 리턴값으로 하는데요 그 값들로는 각각 드라이브를 찾을수 없음(0), 최상위경로가 없음(1), 이동식디스크(2), 고정디스크(3), 네트워크드라이브(4), cd롬(5),램디스크(6) 으로 되있는 데요, 우리가 찾는 HDD와 CD롬은 각각 3과 5에 있습니다. 그냥 문제만 풀거라면 CD롬을 가리키는 □번을 정답으로 쓰면.. 더보기