본문 바로가기

컴퓨터와 보안/리버싱

(14)
함수 호출 규약(Calling Convention) 함수 호출 규약이란? 함수를 호출할 때 '파라미터를 어떤 식으로 전달하는가?' 즉 함수를 호출하는 방식에 대한 일종의 약속이다. 함수 호출 규약은 인자 전달 방법, 인자 전달 순서, Stack Frame을 정리하는 방법 에 따라 그 종류를 구분한다. 함수 호출 전에 파라미터는 스택을 통해 전달된다. 스택이란 프로세스에서 정의된 메모리 공간이며 아래 방향(주소가 줄어드는 방향)으로 자란다. PUSH 명령어는 현재 ESP 레지스터가 가지고 있는 스택 메모리 주소에 인자 값을 저장한다. ESP 포인터는 PUSH 명령 어에 의해 작아지게 되고, 스택이 아래로 길어진다. pop 명령어는 현재 ESP 레지스터가 가지고 있는 스택 메모리 주소에 있는 데이터를 인자로 복사하고, ESP 포인터의 값을 +4 한다. (이 ..
Lena's Reversing for Newbies 오늘은 위의 파일로 리버싱 실습을 진행해 보도록 하겠다. 파일을 실행하면 다음과 같은 창이 뜬다. Nags를 전부 삭제하고 registration code를 찾으라는 말을 한다. 확인을 누르니 다음과 같은 창이 뜬다. 아마도 Regcode는 우리가 찾아야 하는 registration code를 말하는 거 같다. 1234를 입력하고 Register me!를 누르니 다음과 같은 창이 뜬다. 그럼 이제 디버깅을 진행하기위해 ollydbg로 해당 파일을 열어보겠다. 오늘도 평소와 마찬가지로 F8을 누르며 천천히 진행해 본다. 00401160 부분에서 그림 1의 창이 뜬다. 아마 Nags를 없애라는것은 그림 1의 창이 뜨지 않게 하라는 뜻인 거 같다. 우선 search for all referenced text ..
abex' crackme #2 분석 오늘은 위의 파일을 이용해 실습을 진행해 보겠다. 파일을 실행시키면 다음과 같은 창이 뜬다. 일단 ollydbg로 열어서 파일을 분석해본다. 우선 성공과 실패의 분기점을 찾기 위해 문자열 검색 기능(All referenced text strings)를 사용해 보겠다. 문자열 검색 기능을 통해 성공과 실패의 메시지 박스의 위치를 알아냈다. 메시지 박스가 있는 주소를 확인해보니 4023E4위치의 값을 EBP-D4에 입력하는 명령어가 있다. 혹시 모르니 4023E4 주소로 이동해본다. 놀랍게도 문자열이 모여 저장되어있는 곳을 볼 수 있다. 그렇다면 지난번과 마찬가지로 틀림을 의미하는 문자열을 수정하면 되지 않을까...? -> 이게 되면 null패딩에 값을 입력하고 전달인자를 수정하는 방법도 되지 않을까? 위치..
abex' crackme #1 분석 crackme라는 프로그램은 말 그대로 크랙 연습 목적으로 작성되어 공개된 프로그램이다. 위의 파일을 이용해 크랙 연습을 진행해 보겠다. 파일을 실행시키면 다음 문구가 뜬다. HD를 CD-Rom처럼 생각하게 하라니 무슨 소리일까? ollydbg를 켜서 파일을 분석해본다. 다음과 같이 나온다. (EP코드가 매우 짧은 이유는 abex' crackme 파일이 어셈블리 언어로 만들어 졌기 때문이라고 한다.) 일단 F8키를 쭉 쓰면서 파일이 어떻게 진행되는지 파악해본다. (아직 디버깅과 친숙하지 않기도 하고 파일이 짧아 초심자의 기운을 살려 처음부터 F8연타를 하면서 어떻게 진행되는지 알아보았다.) F8연타를 하다보니 알게된 점이 있다. 바로 아랫부분의 ok, I really think that your HD i..
프로세스 메모리 구조와 스택 프레임 구조 프로세스 메모리 구조 프로세스의 메모리 구조는 Text, Data, Heap, Stack 영역으로 구분되어 있다. Text 영역 : 프로그램 코드와 상수가 정의되어 있고, 읽기만 가능한 메모리 영역이기 때문에 데이터를 저장하려고 하면 분할 충돌을 일으켜 프로세스가 중지된다. Data 영역 : 전역 변수(Global variable)와 정적 변수(Static variable)가 저장되어 있는 영역이다. Heap 영역 : 프로그래머의 필요에 따라 동적 메모리 호출에 의해 할당되는 메모리 영역이다. c언어의 기준으로 malloc() 함수나 calloc() 함수에 의해 생성된 변수들이 이 곳에 할당된다. Stack 영역 : 함수 인자 값, 함수 내의 지역 변수, 함수의 반환 주소 등이 저장되는 영역으로 함수 호..
어셈블리어와 레지스터 Assembly language 어셈블리어란? 어셈블리어는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어다. 기계어와 명령어가 1:1로 대응되는 단어들로 구성되어 있다. 고급언어와 다르게 컴파일을 하면 간단한 명령으로 실행되서 실행 속도가 굉장히 빠르다. 임베디드 시스템 or 커널 프로그래밍, 컴퓨터 보안을 위해서는 어셈블리어를 알아야 한다. 위 두 가지의 결정적인 차이는 '한번의 동작을 몇가지 할 수 있는가?' 이다. 위 사진을 보면 어셈블리는 한번에 한 가지 동작밖에 하지 못한다는 것을 알 수 있다. 코드가 간단명료하기에 한 두줄만 봐서는 어떤 목적으로 만들어 졌는지 알 수 없다. 더군다나 많은 부분을 일일히 지정해 줘야 하므로 코드의 길이가 굉장히 길어진다. 그래서 고급언어를 어셈블리어..
PE File Format - pestudio Pestudio 를 통해 PE File Format을 분석해본다. 다운로드는 www.winitor.com/features Winitor - Versions Standard free Analysis of executable in a non-professional context. www.winitor.com 여기서 하면 된다. pestudio를 통해 메모장을 열어본다. PE 구조가 잘 정리되어 있다. Dos - header 우선 PE File Format의 Dos-header 부분은 다음과 같이 분석되어 나온다. offfset이 0x000000E8으로 나오는데 앞의 0x는 16진수 표현이고 000000E8인지를 Hxd를 켜서 비교하면 000000E8 이 딱 나온다. 위쪽의 md5 ~ file-ratio 부분..
PE File Format4 EAT (Export Address Table) Windows 운영체제에서 라이브러리(Library) 란 다른 프로그램에서 불러 쓸 수 있도록 관련 함수들을 모아놓은 파일(DLL/SYS) 이다. Win32 API 가 대표적인 Library 이며, 그 중에서도 Kernel32.dll 파일이 가장 대표적인 Library 파일이라고 할 수 있다. EAT란 라이브러리 파일에서 제공하는 함수를 다른 프로그램에 가져다 사용할 수 있도록 해주는 메커니즘 이다. 앞서 설명한 IAT 와 마찬가지로 PE 파일내에 특정 구조체(IMAGE_EXPORT_DIRECTORY)에 정보를 저장하고 있다. 라이브러리의 EAT 를 설명하는 IMAGE_EXPORT_DIRECTORY 구조체는 PE 파일에 하나만 존재한다. (*참고로 IAT를..