본문 바로가기

리버싱

(6)
[리버싱] Exercise: rev-basic-0 드림핵 워게임 중 하나인 rev-basic-0문제에 대한 풀이를 진행해 보도록 하겠습니다. 우선 파일을 다운 받고 windows PowerShell로 실행을 해보았습니다. AAA라는 문자열을 넣었을때 Wrong이 출력됩니다. 사용자에게 문자열을 입력받고 프로그램 내부의 어떤 검증과정을 거쳐 입력한 문자열이 검증을 통과했다면 Correct, 통과하지 못했다면 Wrong을 출력하는 방식으로 동작한다는 것을 알 수 있습니다. 그다음 IDA로 파일을 열어줍니다. 파일 실행과정을 통해 입력한 문자열을 검증한 후 Wrong이나 Correct문자열을 출력하는 것을 알 수 있었습니다. 따라서 검증하는 위치를 찾기 위해서 파일이 실행될 때 출력되던 문자열을 먼저 검색해 보겠습니다. Shirt+F12 를 이용하여 Stri..
[리버싱] IDA 사용해보기 IDA란? Hex-Rays사에서 제작한 디스어셈블러 IDA의 메인 기능은 디스어셈블이지만 이 외에도 여러환경에서의 디버깅과 다양한 아키텍처 디컴파일과 같이 여러가지 기능을 제공 Helloworle.exe 파일 정적 분석해보기 우선 메인함수를 찾아보도록 하겠습니다. 메인 함수를 찾는데에는 크게 두가지 방법이 있는데요 첫번째는 프로그램의 시작 지점인 진입점(Entry Point, EP)부터 분석을 시작하여 원하는 함수를 찾을 때까지 탐색하는 것이고, 다른 하나는 대상 함수의 특성이나 프로그램의 여러 외적인 정보를 이용하여 탐색하는 방법입니다. 오늘은 후자의 방법을 이용하여 분석해보도록 하겠습니다. Shift+F12를 눌러 String창을 불러옵니다. Helloworld 문자열을 찾아줍니다. 저는 Ctrl+F..
[리버싱] PEViewer로 메모장 분석하기 DOS Header 주요 멤머 변수로는 e_magic 멤버면수와 e_Ifanew 멤버변수가 있습니다. e_magic 멤버변수는 DOS Signature로 PE파일을 나타내는 첫 바이트입니다. e_Ifanew 멤버변수는 NT Header가 시작되는 위치의 옵셋을 뜻합니다. e_Ifanew 값이 가리키는 위치에 NT Header 구조체가 존재해야합니다. 앞에 2바이트(e_magic변수)를 봤을 때 4D 5A가 먼저 적힘을 보아 little Endian을 통해, 시작점이 5A4D임을 확인할 수 있습니다. e_Ifanew를 봤을때 NT_Header의 시작점이 0X000000F0임을 알 수 있습니다. DOS Stub DOS 환경에서 실행되는 코드를 가진 영역, 일종의 옵션으로 없어도 파일 실행에 문제는 없습니다...
[리버싱]X86 Assembly X64 어셈블리 언어 기본구조는 명령어와 피연산자로 구성됩니다 ex) move eax, 3 여기서 move가 명령어, eax와 3가 각각 피연산자1, 2 입니다. move는 피연산자1에 피연산자2의 값을 대입하라는 명령어입니다. 피연산자에는 상수(Immediate Value), 레지스터(Register), 메모리(Memory) 총 3종류가 올 수 있습니다. 메모리 피연산자는 []로 둘러싸인 것으로 표현되며 앞에 크기 지정자(Size Directive) TYPE PTR이 추가될 수 있습니다. 타입의 종류 BYTE 1바이트 WORD 2바이트 DWORD 4바이트 QWORD 8바이트 X86-64 어셈블리 명령어 데이터 이동 move dst, src src의 값을 dst에 옮김 lea dst, src src의 유..
[리버싱]스택(Stack), 레지스터(Register), 스택 프레임(Stack Frame) 스택(Stack) 쌓다 라는 의미로 데이터를 차곡차곡 쌓아 올린 형태의 자료구조 제한적으로 접근할 수 있는 나열구조로 후입선출(LIFO)의 특징을 가지고 있습니다. 스택의 대표적인 사용 사례 웹브라우저 방문기록(뒤로가기), 실행취소(undo), 역순 문자열 만들기, 후위 표기법 계산 스택에 자료를 넣는 것을 push, 스택에서 데이터를 꺼내는 것을 pop이라고 합니다. 다음은 C언어를 사용하여 스택을 구현해 보았습니다. #include #define MAX_STACK_SIZE 10 int stack[MAX_STACK_SIZE]; int top = -1; int isFull() { if (top >= MAX_STACK_SIZE) { printf("스택이 가득 찼습니다."); return 1; } else ..
[리버싱] Binary & Analysis 리버스 엔지니어링이란? 완성품과 이를 구성하는 부품들의 기능과 설계를 고안하고 제작하는 엔지니어링 행위를 거꾸로 하는 것을 합니다. 리버싱은 학습 및 연구용으로 많이 이용되는 기술, 각종 악성코드나 불법 프로그램의 분석 및 대응을 위해서도 사용되는 효과적인 기술입니다. 그러나 프로그램의 전체적인 작동 원리를 알아낼 수 있어 상용 프로그램의 지적 재산권을 침해할 수 있다는 위험성도 존재합니다. 테스팅이나 연구, 학습 등을 목적으로 한 리버싱은 저작권을 침해하지 않는 한에서 제한적으로 허용되지만 저작권을 침해하는 행위는 법적인 문제로 이어질 수 있으니 주의가 필요하겠습니다. 바이너리(Binary)에 대하여 프로그램 : 연산장치가 수행해야하는 동작을 정의한 일종의 문서 많은 정보분야의 엔지니어들은 프로그램을 ..