Reversing Engineering - 7. 쉬운 crackme를 통한 디버거 사용법 - 2 # 프롤로그 - 문제는 어떤 값을 입력을 받아 특정 조건을 만족하면 correct!을 출력하고 틀리면 wrong!을 출력함 # 문제 풀이 - 0 - 처음 문제를 실행하면 input: 이라는 문자열이 출력됨 - 문제 지문에서 어떠한 형식으로 값을 입력받는지에 대해 알려주지 않았기 때문에 적당히 아무 문자열을 넣고 enter를 누르면 wrong!이 뜨는 것을 볼 수 있음 - 어떠한 형식으로 입력을 받는지는 모르지만, 문제의 형태가 이전 강의에서 풀이한 문제와 비슷 > 다음과 같은 방식으로 분석할 수 있을 것임 1. 메인함수를 찾아낸다 2. 입력의 형식이 어떤 형식인지 알아낸다 3. 입력받은 값은 어떤 방식으로 처..
Reversing Engineering - 6. 쉬운 crackme를 통한 디버거 사용법 - 1 # 프롤로그 - 문제는 2개의 정수를 입력받아 값이 특정 조건을 만족하면 correct!을 출력하고 틀리면 wrong!을 출력함 # 문제 풀이 - 0 > 주어진 문제를 실행하면 input: 이라는 문자열이 출력됨 > 숫자 2개를 입력하면 wrong! 이라는 문자열을 출력함 - 추측 > main함수에서 printf, puts 등의 출력 함수 및 scanf와 같이 입력을 받는 함수가 포함되었을 것임 > wrong!이 출력되기 전 입력받은 숫자 2개를 처리하는 부분이 있을 것임 # 문제 풀이 - 1 - 다양한 방법으로 찾을 수 있지만 Az 버튼을 사용하여 input: 문자열을 찾아 main 함수를 발견 > 처음 출..
Reversing Engineering - 5. hello-world로 배우는 x64dbg 사용법 # 프롤로그 - hello-world.cpp // hello-world.cpp #include void main(){ puts("hello world!\n"); } # x64dbg 기본 설정 - x64dbg로 hello-world.exe를 열면 아무런 설정을 안했을 경우 아래와 같이 뜸 > 박스 부분을 살펴보면 현재 ntdll부분에 멈춰있는 것을 알 수 있음 > 이는 x64dbg가 기본적으로 시스템 중단점 설정이 켜져있기 때문 - 설정 - 환경설정으로 들어가서 아래 사진과 같은 창에서 시스템 중단점 설정을 변경해야 함 > 위의 창에서 박스로 표시된 옵션을 해제하면 됨 > 이후 디버깅 프로그램을 재시작하면 시..
Reversing Engineering - 4. x64dbg 1. x64dbg 사용법 # x64dbg - 윈도우 디버거 - UI나 기능 등 많은 면에서 ollydbg를 닮았으며, ollydbg는 소스 코드가 공개되어 있지 않고 32비트만 지원하는데 반해 x64dbg는 오픈소스이고 32비트와 64비트를 둘 다 지원 - 강력한 디스어셈블 엔진을 가지고 있으며 그래프 뷰, 플러그인 등 리버싱에 있어서 편리한 여러가지 기능들이 내장되어 있음 # x64dbg의 사용법 - 기본적인 UI - x64dbg의 상단바 1. 분석할 프로그램을 열음 2. 프로그램을 재시작함 3. 프로그램을 완전히 정지 4. 프로그램을 실행(재개)함 5. 프로그램을 일시정지 시킴. 실행중인 상태에서 임의로 중단시키고 싶을 때 사용 6. 어셈블..
Reversing Engineering - 3. puts("hello world!\n") → x86_64 asm 1. hello world # hello world - 1 - "hello world!"를 출력하는 코드가 어떤식으로 어셈블리 코드로 바뀌었는지 확인 #include int main(){ puts("hello world!\n"); return 0; } > 소스는 visual studio code 2019를 통해 64비트 릴리즈 모드로 컴파일 # hello world - 2 - 보는 방법 1. 주소: 해당 어셈블리 코드의 시작 주소가 표시됨 2. 기계 코드 > 사람이 읽을 수 있는 어셈블리 코드의 전 단계인 기계어가 여기에 표시됨 > : 앞에 있는 값은 prefix이고 띄어쓰기 다음에 있는 부분..
Reversing Engineering - 2. x64 기초 1. Introduction # Intorduction - 디스어셈블 과정을 거쳐 나온 어셈블리 코드를 이해하기 위해 어셈블리 코드에 대해 공부할 것 - 어셈블리 코드는 기계 코드와 1:1 대응 - 기계 코드가 실제로 동작할 CPU에 따라 기계 코드 역시 달라지게 됨 > CPU에 따라 어셈블리 코드도 다름 2. 들어가기에 앞서 # Instruction Cycle - 어셈블리 코드는 기계 코드와 대응되므로, 기계 코드가 동작할 CPU가 어떤 역할을 하고 어떻게 동작하는지 알아보는 것이 어셈블리 코드를 이해하는데 도움이 됨 - CPU의 기본적인 동작 과정 > CPU: 다음 실행할 명령어를 읽어오고(Fetch) → 읽어온 명령어를 해석한 다음(Dec..
Reversing Engineering - 1. 리버싱 엔지니어링이란 1. Reversing Engineering # Reversing Engineering - 리버싱 엔지니어링은 이미 만들어진 시스템이나 장치에 대한 해체나 분석을 거쳐 그 대상 물체의 구조와 기능, 디자인 등을 알아내는 일련의 과정 - 소프트웨어 뿐만 아니라 기계공학, 전자공학은 물론 생물학 등에서도 폭넓게 쓰임 - '완성품의 설계도 없이 구조와 동작 과정을 알아내는' 모든 단계 - 자료나 책에 따라 '역공학'이라고 지칭하기도 함 - 줄여서 '리버싱'이라고도 함 # 'Software' Reversing Engineering - 리버싱이 산업의 전 분야에 걸쳐 적용될 수 있지만, 여기서는 소프트웨어를 대상으로 할 것 - 즉, 소스 코드가..