기본 콘텐츠로 건너뛰기

lena-tutorial-1

lena tutorial 1, 2

lena tutorial은 리버스 엔지니어링을 연습하기 좋은 문제들로 구성되어 있어 많은 학습자들이 애용하는 자료이다.

튜토리얼을 실행하면 Evaluation period out of date. Purchase new license 메시지 창이 실행되는 것을 확인할 수 있다. 디버깅 도구를 이용하여 디스어셈블리를 확인해보면 “Keyfile.dat” 파일을 읽으려 한다는 것을 알 수 있다.

CODE:0040105C                 push    0               ; hTemplateFile
CODE:0040105E                 push    offset unk_40216F ; dwFlagsAndAttributes
CODE:00401063                 push    3               ; dwCreationDisposition
CODE:00401065                 push    0               ; lpSecurityAttributes
CODE:00401067                 push    3               ; dwShareMode
CODE:00401069                 push    0C0000000h      ; dwDesiredAccess
CODE:0040106E                 push    offset FileName ; "Keyfile.dat"
CODE:00401073                 call    CreateFileA
CODE:00401078                 cmp     eax, 0FFFFFFFFh
CODE:0040107B                 jnz     short loc_40109A
CODE:0040107D                 push    0               ; uType
CODE:0040107F                 push    offset Caption  ; " Key File ReverseMe"
CODE:00401084                 push    offset Text     ; "Evaluation period out of date. Purchase"...
CODE:00401089                 push    0               ; hWnd
CODE:0040108B                 call    MessageBoxA
CODE:00401090                 call    ExitProcess

Keyfile.dat 파일이 없는 경우 -1을 반환하므로 0040107B에서 다음 로직으로 이동하지 못하고 메시지 창 출력 후 프로세스를 종료하는 것을 확인할 수 있다. Keyfile.dat 파일 생성 후 다시 진행해보자.

Keyfile is not valid. Sorry. 문구를 출력하고 프로세스가 종료되는 것을 확인할 수 있다. 조금 더 살펴보면 이번 튜토리얼의 목적인 You really did it! Congratz !!!" 메시지 창을 출력하는 코드를 만날 수 있다. 어떻게 하면 성공 코드에 도달할 수 있을까.

CODE:004010A9                 call    ReadFile
CODE:004010AE                 test    eax, eax
CODE:004010B0                 jnz     short loc_4010B4
CODE:004010B2                 jmp     short loc_4010F7
CODE:004010B4
CODE:004010B4 loc_4010B4:                             ; CODE XREF: start+B0↑j
CODE:004010B4                 xor     ebx, ebx
CODE:004010B6                 xor     esi, esi
CODE:004010B8                 cmp     ds:NumberOfBytesRead, 10h
CODE:004010BF                 jl      short loc_4010F7
CODE:004010C1
CODE:004010C1 loc_4010C1:                             ; CODE XREF: start+D1↓j
CODE:004010C1                 mov     al, ds:byte_40211A[ebx]
CODE:004010C7                 cmp     al, 0
CODE:004010C9                 jz      short loc_4010D3
CODE:004010CB                 cmp     al, 47h
CODE:004010CD                 jnz     short loc_4010D0
CODE:004010CF                 inc     esi
CODE:004010D0
CODE:004010D0 loc_4010D0:                             ; CODE XREF: start+CD↑j
CODE:004010D0                 inc     ebx
CODE:004010D1                 jmp     short loc_4010C1
CODE:004010D3
CODE:004010D3 loc_4010D3:                             ; CODE XREF: start+C9↑j
CODE:004010D3                 cmp     esi, 8
CODE:004010D6                 jl      short loc_4010F7
CODE:004010D8                 jmp     loc_401205

4010F7으로 이동 시 실패, 401205으로 이동 시 성공이다. 첫 번째로 004010B8cmp ds:NumberOfBytesRead, 10h를 만족하기 위해서 Keyfile.dat 파일은 16자리 이상으로 구성되어야 한다. 두 번째로 004010D3cmp esi, 8를 만족하기 위해서 ‘G’가 8개 이상(004010CBcmp al, 47h) 포함되어야 한다. 004010C7cmp al, 0로 확인하여 null 일 시 비교를 시작하므로 GGGGGGGGGGGGGGGG를 Keyfile.dat에 저장하면 You really did it! Congratz !!!" 메시지 창이 출력되는 것을 확인할 수 있다.

이 블로그의 인기 게시물

데일 카네기 인간관계론 정리

Remove-Server-Header

응답 메시지 내 서버 버전 정보 제거 1. Apache 1) 조치 방법 “/etc/htpd/conf/httpd.conf” 파일 안에서 1. ServerTokens OS → ServerTokens Prod 2. ServerSignature On → ServerSignature Off 로 변경한 후 아파치를 재시작하면 헤더 값의 아파치 버전 정보 및 OS 정보를 제거할 수 있다. 2) 참고 URL http://zetawiki.com/wiki/CentOS_ 아파치_보안권장설정_ServerTokens_Prod,_ServerSignature_Off 2. IIS 1) 조치 방법 IIS 6.0 urlscan_setup 실행. 설치. \windows\system32\inetsrv\urlscan\urlscan.ini 파일을 열어 다음 수정(RemoveServerHeader=0 을 RemoveServerHeader=1 로 변경) 서비스에서 IIS Admin Service 재시작. IIS 7.0 IIS 관리자를 열고 관리하려는 수준으로 이동합니다. 기능 보기에서 HTTP 응답 헤더를 두 번 클릭합니다. HTTP 응답 헤더 페이지에서 제거할 헤더를 선택합니다. 작업 창에서 제거를 클릭하고 예를 클릭합니다. 2) 참고 URL IIS 6.0 : http://gonnie.tistory.com/entry/iis6- 응답헤더-감추기 IIS 7.0 : https://technet.microsoft.com/ko-kr/library/cc733102(v=ws.10).aspx 3. jetty 1) 조치 방법 “jetty.xml” 파일에서 jetty.send.server.version=false 설정 2) 참고 URL http://attenuated-perspicacity.blogspot.kr/2009/09/jetty-61x-hardening.html 4. Nginx ...

American Fuzzy Lop And Address Sanitizer

American Fuzzy Lop And Address Sanitizer Address Sanitizer(ASAN) 단지 gcc/clang에 -fsanitize=address 옵션을 추가하는 것으로 간단히 사용할 수 있지만 그 효과는 충분하다. Example Out Of Bounds Read #include <stdio.h> int main() { int a[ 2 ] = { 3 , 1 }; int i = 2 ; printf ( "%i\n" , a[i]); } 예제 파일을 OutOfBoundsRead.c 로 생성하고 ASAN 옵션을 지정하여 clang 으로 컴파일하자. clang -g -fsanitize = address -fno -omit -frame -pointer OutOfBoundsRead . c -o OutOfBoundsRead 생성된 OutBoundsRead 파일을 실행하면 다음과 같은 결과를 볼 수 있다. ================================================================= ==3678==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffc0ba87428 at pc 0x47b7db bp 0x7ffc0ba87390 sp 0x7ffc0ba87388 READ of size 4 at 0x7ffc0ba87428 thread T0 ==3678==WARNING: Trying to symbolize code, but external symbolizer is not initialized! #0 0x47b7da (/root/ASAN/OutOfBoundsRead+0x47b7da) #1 0x7faba0260f44 (/lib/x86_64-linux-gnu/libc.so.6+0x21f44) #2 0x...