리버싱 26

코드엔진 Basic RCE L05

문제 : 이 프로그램의 등록키는 무엇인가 답 : GFX-754-IER-964 일단은 늘 해왔듯이 그냥 프로그램을 실행시켜본다. 그랬더니 이런 인증창이 뜨고 아이디와 일련번호를 입력하고 등록하는 기능이 있다. 아무 값이나 위 칸에 넣고 버튼을 눌렀다. 이렇게 일련번호가 틀렸다는 메시지 박스가 뜨며 별다른 건 없다. 또한 패킹 여부를 알기 위해 Detect It Easy로 열어보았더니 역시 패킹되어있었다. 익숙한 UPX로 언패킹되어있는데 운이 좋게도 OllyDbg는 UPX로 패킹된 파일을 자동으로 언팩해준다. 나 스스로 언패킹해도 좋지만 이번 문제는 언패킹이 중점이 아니니 일단 넘어간다. 자 이제 확인했으니 OllyDbg로 열어보자. 늘 보던 익숙한 창이 보인다. 그런데 현재 구하려고 하는 목표는 일련번호이..

리버스 엔지니어링 바이블과 마스터링 리버스 엔지니어링에 대하여

나는 특정 학문을 공부할때 책을 구매하여 공부하는걸 굉장히 좋아한다. 책이라는 물건 안에 다양한 지식과 정보가 체계적으로 정리되어있기 때문이라고 할 수 있는데, 이번 글은 내가 리버스 엔지니어링 공부를 할때 겪은 어려움인 책 고르기에 대한 글이다. 리버스 엔지니어링은 관련 서적이 상당히 많은 해킹 분야라고 생각이 든다. 당장 인터넷 서점에 '리버싱', '리버스 엔지니어링'이라고만 검색해도 타 분야 '포너블', '웹해킹'보다 비교적 많은 수의 도서를 찾을 수 있다. 그러나 정작 그 많은 책중 무엇을 골라야할지 고민이 되는 건 당연하다. 아마 대부분의 사람들은 독자리뷰, 타 블로거의 리뷰를 보고 대체로 "리버스 엔지니어링 바이블", "리버싱 핵심원리"를 구매할것이라고 생각한다. 이 책들은 상당히 좋은 책들이..

코드엔진 Basic RCE L03

문제 : 비주얼베이직에서 스트링 비교함수 이름은? 답 : vbaStrCmp 일단 프로그램을 그냥 실행시켜보았다. 그러면 이렇게 오류 메시지가 뜨고 프로그램이 실행이 안된다. 오류창을 보니 MSVBVM50.DLL 파일이 없어서 안된다고 하는것 같으니 일단 구글에 파일에 대해 검색해본다. https://boksbooks.tistory.com/67 라는 글을 보고 DLL누락 문제를 해결했다. DLL파일을 설치하고 다시 실행하니 이런 창이 뜬다. 사진 1은 외국어로 뭐라고 적혀있는데 문제에서도 나와있듯이 비밀번호를 입력하라는것 같다. 두번째창은 비밀번호를 입력하고 왼쪽 버튼을 눌러서 인증할수있다. 이제 프로그램이 어떻게 돌아가는지 알았으니 디버거로 열어본다. 일단 막막하다. 엔트리 포인트인 00401168에서 ..

코드엔진 Basic RCE L02

문제 : 패스워드로 인증하는 실행파일이 손상되어 실행이 안되는 문제가 생겼다. 패스워드가 무엇인지 분석하시오 답 : JK3FJZh 일단 평소대로 문제 파일을 실행해 보았다. 그랬는데 이상하게 이런 화면이 뜨며 앱을 실행할 수 없다고 한다. 평소에 문제파일은 항상 정상적으로 실행된다는 고정관념을 가졌던 나는 어? 문제 파일이 누락됐나? 라며 구글링을해서 헥스에디터로 열어야 한다는 것까지 확인후 나 스스로 풀어보았다. 참고 글 : https://jie0025.tistory.com/26 일단 헥스 에디터로 막연하게 파일을 열어 보았다. 그랬더니 무언가 잔뜩 떴다. OllyDbg로 리버싱을 하며 자주 봤던 것들이였다. 일단 비밀번호를 찾는 것이니 아무거나 얻어 걸려라는 마음으로 옆에 보이는 텍스트 부분을 죄다 ..

코드엔진 Basic RCE L01

문제 : HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가 답 : 5 이 문제는 리버싱 과정 없이 사실 구글에 GetDriveTypeA라는 함수를 검색후 마이크로소프트 문서에서 CDROM일 경우의 리턴값을 찾아서 답을 입력해서 풀수도 있는 단순한 문제이다. 그러나 이렇게 문제를 푸는건 프로그램의 동작방식을 분석하는 방법이 아니므로 OllyDbg로 파일을 열고 분석해보았다. 일단 디버거로 분석하기전 그냥 프로그램을 실행해서 프로그램이 어떻게 동작하는지 살펴보았다. 처음에 1번 사진이 뜨고 자신이 나의 하드디스크를 CD-ROM으로 인식하게 만들라고 말한다. 확인을 누르면 CD-ROM이 아니라고 말하며 다시 확인을 누르면 프로그램이 종료된다. 프로그램의 동작..

리버싱 공부시 나와의 약속 (5~6월달)

일단 리버싱 입문을 1회독 했으니 리버싱 입문 도서를 복습하면서 매일 코드엔진 문제를 풀어야겠다. 1. 리버싱 입문 복습 일단 부록에 나오는 부분은 꼭 한번 보고 기억할건 기억해두자. 부록을 다 본 다음에는 01 - 1~3 , 02 - 1.7~1.8 , 02 - 2.3~2.6, 03 1.1 ~ 1.3, 03 - 2.2, 03 - 3.2~3.3 04 - 2 전체, 04 - 3 전체, 05 전체, 06 다 다시 해보기 , 07 전체 한번 더 읽기 정도로 복습한다. 2. 코드엔진 문제 풀기 하루에 최소 1문제 최대 3문제를 푼다. 문제를 풀때는 한문제당 40분 타이머를 맞추고 40분안에 풀지 못했다면 풀이를 보고 원리를 이해한다. 문제를 풀었다면 이 블로그에 풀이를 적고 풀지 못했다면 다른 분들의 풀이를 보고..

리버싱 2021.05.09

리버싱 입문_6장 지뢰찾기 게임

리버싱 시 팁들 비교구문을 잘 눈여겨 보자 예) CMP A,B 비교구문 실행 후 점프문 실행 전 제로 플래그를 바꾸어 가면서 결과의 변화를 통해 어떤 코드인지 예측해보자. CALL 구문을 눈여겨 보자 예) CALL 주소 어떤 서브루틴을 호출하는지 F7을 통해 스탭 인투로 로직을 살펴보기도 하면서 어떤 기능인지 알아보자. 리버싱은 디버거로 코드와 스택, 메모리에 있는 값을 관찰하면서 의미하는게 무엇인지 추측하고 프로그램을 반복적으로 실행하면서 추측이 맞는지 확인해야한다.

리버싱 입문 4장 리버싱 좀더 깊숙이 128~139쪽

1.콜 스택 프로그램에서 사용하는 서브루틴에 대한 정보를 저장하기 위한 자료구조. 사용하는 주 목적은 서브루틴 간 호출 순서를 추적할 수 있는 정보를 저장하는 것. 예) 서브루틴 호출 순서가 A -> B -> C일때 서브루틴 C가 종료됐을때 B가 어디로 되돌아가서 다시 동작을 계속해야 할지에 대한 정보를 콜 스택에 저장한다. 서브루틴 A가 명령어 6까지 있다고 가정할때 3까지 실행 후 서브루틴 B를 호출 -> 서브루틴 B가 저장된 위치로 가서 서브루틴 B의 명령어인 명령어 1 ~ 명령어 3까지 순서대로 수행하고 다시 서브루틴 A로 돌아옴 -> 복귀 주소는 서브루틴 B의 호출 명령어 다음인 명령어 4임 (자세한건 133쪽 참고) 복귀주소는 스택이라는 자료구조에 넣어두고 B의 동작이 완료후 사용해서 복귀2...

코드엔진 Basic RCE L04

문제 : 이 프로그램은 디버거 프로그램을 탐지하는 기능을 갖고 있다. 디버거를 탐지하는 함수의 이름은 무엇인가 1. 프로그램 구조 Detect It Easy(이하 DIE)로 파일을 열어보니 C/C++로 제작된것인것 같고 콘솔 애플리케이션 형태인것 같다. 일단 여기선 크게 중요하지 않으니 넘어가자. 2. 프로그램 동작 파일을 실행하면 약 1초간격으로 현재 상태에 따라 콘솔에 글이 적힌다. 보아하니 "정상"이라는 말은 디버거로 분석중이지 않다는 의미인것 같다. 이제 디버거로 열어 분석해보자. 3. 분석 이렇게 풀어도 되는지는 모르겠지만 여기서 문제를 잘 살펴보면 디버거를 탐지하는 함수의 이름을 구하라고 하였다. 즉 올리디버거의 기능중 하나인 API검색기능으로 함수를 찾을수도 있다는 의미이다. 그렇다면 코드 ..

abex crackme 3 풀이 + 함수 호출 규약

1. 프로그램 개발 언어 알아내기 Detect It Easy 프로그램을 설치하고 실행하여 개발 언어, 패킹 여부를 알아내려는 프로그램을 연다. 그렇다면 이런 창이 뜰 건데 여기 빨간 줄이 쳐져 있는것이 그 프로그램의 언어이다. (패킹 여부는 필자가 이 시점에서 배우지 않아 일단 생략한다.) 패킹 여부와 프로그램의 언어를 알아내는 것은 프로그램을 분석하기에 앞서 중요하다고 하니 꼭 습관을 들여야겠다. 2. 함수 호출 규약 함수를 호출할 때 인자를 전달하는 방식으로 "cdecl", "stdcall", "fastcall" cdecl : 매개변수가 오른쪽에서 왼쪽으로 스택으로 전달된다. 예를 들어 매개변수가 a,b인 sum 함수를 호출하면... sum(a,b); b와 a순서로 스택에 전달된다는 의미이다. 또한 ..