리버싱 입문을 위한 Lena Tutorial 입니다.

 

유튜브에 보안프로젝트 재즐보프님이 강의를 올려주신 것을 활용하여 함께 공부할 겸 정리해보려고 합니다!

 

총 40번까지의 문제와 강의가 있지만, 11번부터는 유료로 진행되기 때문에 1~10번 까지만 올릴 예정입니다.

10번까지는 디버거 사용법 및 적응기간이라 할 수 있고 이후에는 안티디버깅과 패커 프로텍터와 우회기법 등 심화적인 내용을 다룹니다.

 

10번까지만 해도 리버싱을 처음 접하는 입장에서 굉장히 유익하다고 생각하고, 더 깊게 공부하실 분은 인프런에서 결제 후 영상 보시는 것을 추천드립니다!

 

 

============================================================================

 

실습은 버츄얼박스로 MS윈도우 XP 체험판에서 진행합니다.

 

사용하는 툴은 올리디버거를 사용하고, 실습파일과 윈도우XP체험판, 올리디버거는 댓글에 다운로드 링크 달아드리겠습니다.

 

 

버추얼박스 설치하시고 다운받은 윈도우 붙여주시면 됩니다. 

네트워크 및 공유폴더 설정은 댓글에 재즐보프님께서 올려주신 영상 링크를 함게 올리겠습니다. 

(기본적인 설정방법을 다 알고계신다면 넘어가셔도 됩니다. 공유폴더만 설정하시면 문제없이 하실거에요)

 

설정을 다 하시면 실습파일과 올리디버거를 받아주시면 되는데, 실습파일 다운하면 아래와 같은 40개의 폴더가 나옵니다.

 

 

왼쪽 위에서부터 1번이구요 안에 들어가보시면

 

이런식으로 구성되어있는데 실제로 사용할 파일은 files폴더 안에 있는

 

 

 

reverseMe 파일입니다!

 

 

파일 다운로드가 끝나면 올리디버거 설정을 간단하게 해줘야 합니다.

 

위에 사진에 있는 ollydbg 설정 파일을 잘라내서 

올리디버거가 설치된 폴더에 붙여주시면 됩니다.

 

그런다음 올리디버거를 켜주시면..!

짜잔 오류가 나게됩니다! 

 

그럼 이제 해결을 해봅시다.

 

일단 OK를 누르면 올리디버거 빈 화면이 나오는데 위에 Option-Appearance - Directories에 들어갑니다.

오류가 난 이유가 저기 나와있는 UDD와 Pluging 폴더 경로가 없는 경로라서 오류가 나게 됩니다. 그럼 간단하게 저 경로를 만들어주면 해결이 됩니다.

 

이런식으로 올리디버거 설치폴더에 UDD와 Plugins라는 폴더를 만들어 줍시다.

 

 

그 다음 각각 폴더의 경로를 복사하고

 

여기에 새로 붙여넣기를 하면 됩니다. Plugin도 마찬가지로 복사해서 붙여넣어주세용

 

OK를 누르고 올리디버거를 끄고 다시 시작하면 오류없이 실행이 됩니다.

 

다음 잘 돌아가는지 확인을 위해 예시로 메모장 파일을 열어봅시다.

 

File - Open 한 후에

경로를 c:\windows\notepad.exe 하고 Open 해봅시다.

 

 

 

요런식으로 뜨면 성공입니다. 혹시나 글씨체를 키우고싶다 하시면

 

Option - Appearance - Fonts - Change 에서 키우시면 됩니다.

 

그럼 다음 글 부터 1번문제 들어가도록 하겠습니다!

 

 

출처 :

https://cha4ser.tistory.com/entry/%EB%A0%88%EB%82%98-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-0-%EC%8B%A4%EC%8A%B5-%EC%A4%80%EB%B9%84?category=892885

 

 

01. 올리 디버거 + 어셈블리어를 이해하여 기본적인 "reverseme" 바이너리 패치
02. 어셈블리어를 이해하여 "reversme" 바이너리에서 요구하는 키 파일 생성
03. 기본적인 Nag 창 제거 및 PE 헤더 문제
04. 기본 및 외관(실행에는 중요하지 않지만 그냥 깔끔하게 하기 위함) 패치
05. "JMP" 등과 같은 조건문(분기문)에서의 조건 비교, BP 및 Animate Over/IN
06. "The Plain Stupid" 패치 방법 및 문자열 검색 기능
07. "Intermediate" 레벨 패치 방법
08. W32Dasm 툴을 이용한 디버깅, "VA / Offset" 설명 및 "LordPE" 헥스 에디터처럼 사용하기
09. "Visual Basic" 개념 및 "SmartChecK" 툴 설정 및 사용법
10. "Visual Basic" 리버싱, 디컴파일러 사용법 및 기본적인 안티 안티 디버깅 기법
11. 올리 디버거의 "Pane Window"를 이용한 "Intermediate" 레벨 패치 방법
12. 여러 패치를 이용하여 프로그램 흐름 바꾸기
13. 소프트웨어 내에서 API 사용법 및 더블체킹(이중 체크) 트릭 우회 방법
14. 인라인 패치
16. 코드 흐름 분석하는 방법 및 포인터를 사용한 인라인 패치
17. 기본적인 (셀프) 키젠의 개념
18. "분석 방해 코드(잉여/쓰레기 코드)", 암/복호화, 자기 변조 코드 및 다형성 코드
19. 디버거 탐지 및 안티 안티 디버깅 기법 설명
20. 패커와 프로텍터 - 입문
20. 임포트 리빌딩
22. API 리다이렉트
23. "Stolen Bytes"
24. 로더를 이용하여 프로그램 실행 시 패치하는 기법
25. 로더를 이용하여 프로그램 실행 시 패치하는 기법 및 "Armadillo" 프로텍터 언패킹
26. 특정 환경에서 동작하는 로더 및 "Armadillo" 언패킹/디버깅
27. "tElock" 프로텍터 및 "Advanced" 패치
28. 서버 체크 우회 및 종료하는 기법
29. 서버 체크 우회 및 종료하는 고급 기법
30. SFX, Run Trace 및 고급 문자열 검색 기능
31. 올리 디버거와 "DeDe"에서 델파이 바이너리 분석하기
32. 바이너리 제작자 트릭, HIEW 툴 사용 및 인라인 패치
33. FPU, 무결성 체크 & 로더 vs 패쳐
34. 패킹 된 바이너리 리버싱 및 ASProtect 패커를 대상으로 하는 Search and Replace 로더 생성
35. 다형성 코드 (바이너리) 인라인 패치
36. 키젠       
37. 심도 있는 언패킹 & 패커 / 프로텍터 혼합 안티 안티 디버깅
38. 언패킹 & DLL / TLS 를 이용한 디버거 탐지 
39. 패커 + CRC 체크 적용된 DLL 내부에서 "blowfish" 인라인 + "ASProtect SKE2.2" 언패킹     
40. 난독화, 그리고 알고리즘 하이딩/숨기기

 

 

 

출처

: https://bob3rdnewbie.tistory.com/155?category=680106

(gdb) info reg

모든 register 정보 확인

 

 

(gdb) info reg $rsp

rsp의 register 정보 확인

 

 

(gdb) x/t $rsp

2진수로 register rsp의 메모리 확인

 

 

(gdb) x/o $rsp

8진수로 register rsp의 메모리 확인

 

 

(gdb) x/o 0x00000000004005bd

8진수로 메모리주소로 메모리확인

 

 

(gdb) x/d $rsp

10진수로 register rsp의 메모리 확인

 

 

(gdb) x/u $rsp

unsigned 10진수로 register rsp의 메모리 확인

 

 

(gdb) x/x $rsp

16진수로 register rsp의 메모리 확인

 

 

(gdb) x/c $rsp

문자열로 register rsp의 메모리 확인

 

 

(gdb) x/f $rsp

부동소수점으로 register rsp의 메모리 확인

 

 

(gdb) x/s $rsp

문자열로 register rsp의 메모리 확인

 

 

(gdb) x/bx $rsp

1byte 단위로 메모리 확인

 

 

(gdb) x/hx $rsp

2byte 단위로 메모리 확인

 

 

(gdb) x/wx $rsp

4byte 단위로 메모리 확인

 

 

(gdb) x/gx $rsp

8byte 단위로 메모리 확인(64bit 환경)

 

 

(gdb) x/10gx $rsp

현재 명령어 이후로 8byte 단위로 10개의 메모리 확인(64bit 환경)

 

 

 

 

출처 :

blog.naver.com/kjycracker/221677591285

'Reverse Engineering > gdb' 카테고리의 다른 글

lea, and, or, xor 명령어  (0) 2020.10.10
sub, add 명령어  (0) 2020.10.10
gdb - Segmentation Fault, 대괄호 [ ]  (0) 2020.10.07
gdb 명령어, 리틀엔디언 방식  (0) 2020.10.07
gdb 실행, 명령어  (0) 2020.10.07

여기서 R로 시작하는 이유는,

프로세스가 64bit환경이라 그렇다 32bit환경은 E로 시작한다. 첫번째 문자는 그냥 환경에 맞춰서 그에 해당하는 문자가 출력이 된다.

 

 

RAX(EAX) : 누산기(Accumultor) 레지스터

RBX(EBX) : 베이스 레지스터

RCX(ECX) : 카운터 레지스터

RDX(EDX) : 데이터 레지스터

 

RSP(ESP) : 스택 포인터 레지스터

RBP(EBP) : 베이스 포인터 레지스터

RSI(ESI) : 출발지(source) 인덱스 레지스터

RDI(EDI) : 목적지(Destination) 인덱스 레지스터

RIP(EIP) : RIP 레지스터는 프로세서가 읽고 있는 는 현재 명령의 위치를 가리키는 명령 포인터(Instruction Pointer)레지스터

 

 

 

이 레지스터들은 포인터나 인덱스라 부르기도 한다.

 

포인터 레지스터는 메모리의 위치를 가리키는 64비트 주소를 저장하므로 포인터라 불린다. 이 레지스터들은 프로그램을 실행하고 메모리 관리를 하는데 쓰여 아주 중요하다

 

인덱스 레지스터들은 데이터가 읽히거나 써질 떄 근원지아 목적지를 가리키는 포인터로 쓰이는 포인터다 이 레지스터들은 불러오기 명령과 저장하기 명령에서 쓰이기도 하지만 대부분의 경우 이 헤지스터들을 범용 레지스터로 생각하면 된다. 

 

 

 

출처 :

blog.naver.com/pjt3591oo/220395406400

ld -I/lib/ld-linux.so.2 명령

 

 

-> ld-linux 패키지 설치(CentOS만 해당되는 것으로 추정.)

 

 

ld, ld.so

링크 편집기, 동적 링크 편집기.

 

ld.so 는 dynamic linker / loader로

/lib/*.so 나 /usr/lib/*.so 등의 shared object를 끌어오는 역할을 한다.

 

 

 

 

ld를 사용한 링킹

 

-l : 링킹 될 라이브러리 지정

 

e.g> test 바이너리에 fl 라이브러리 포함

$ ld -dynamic-linker /lib/ld-linux.so.2 -o test /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o main.o funcs.o -lc -lfl

objdump -d 오브젝트 파일을 디스어셈블하여 출력해준다.

 

objdump

 

objdump GNU 바이너리 유틸리티의 일부로서, 라이브러리, 컴파일된 오브젝트 모듈, 공유 오브젝트 파일, 독립 실행파일등의 바이너리 파일들의 정보를 보여주는 프로그램이다. objdump ELF 파일을 어셈블리어로 보여주는 역어셈블러로 사용될 수 있다.

 

예를 들자면 오브젝트 파일을 역어셈블 하기 위해서 아래와 같이 쓴다:

objdump -Dslx file

 

objdump는 오브젝트 파일들의 내용을 읽을때 BFD 라이브러리를 사용한다. readelf(GNU Binutils에 역시 포함되어 있다.)는 objdump처럼 ELF 파일들을 읽을 수 있지만 BFD 라이브러리를 사용하지 않는다.

GNU 프로젝트는 높은 기능을 갖춘 objdump 프로그램을 GNU Binutils 패키지에 포함시키고 있다.

 

출력 예제

$ objdump -D -M intel file.bin | grep main.: -A20

 

4004ed: 55                                         push rbp 
4004ee: 48 89 e5                                mov rbp,rsp 
4004f1: c7 45 ec 00 00 00 00             mov DWORD PTR [rbp-0x14],0x0 
4004f8: c7 45 f0 01 00 00 00              mov DWORD PTR [rbp-0x10],0x1 
4004ff: c7 45 f4 02 00 00 00              mov DWORD PTR [rbp-0xc],0x2 
400506: c7 45 f8 03 00 00 00             mov DWORD PTR [rbp-0x8],0x3 
40050d: c7 45 fc 04 00 00 00             mov DWORD PTR [rbp-0x4],0x4 
400514: c7 45 ec 00 00 00 00             mov DWORD PTR [rbp-0x14],0x0 
40051b: eb 13                                     jmp 400530 <main+0x43> 
40051d: 8b 05 15 0b 20 00                 mov eax,DWORD PTR [rip+0x200b15] # 601038 <globalA> 
400523: 83 e8 01                                 sub eax,0x1 
400526: 89 05 0c 0b 20 00                 mov DWORD PTR [rip+0x200b0c],eax # 601038 <globalA> 
40052c: 83 45 ec 01                           add DWORD PTR [rbp-0x14],0x1 
400530: 8b 05 02 0b 20 00                 mov eax,DWORD PTR [rip+0x200b02] # 601038 <globalA> 
400536: 39 45 ec                               cmp DWORD PTR [rbp-0x14],eax 
400539: 7c e2                                     jl 40051d <main+0x30> 
40053b: 5d                                         pop rbp 
40053c: c3                                           ret 
40053d: 0f 1f 00                                 nop DWORD PTR [rax]

 

 

objdump -d

Description

objdump displays information about one or more object files. The options control what particular information to display. This information is mostly useful to programmers who are working on the compilation tools, as opposed to programmers who just want their program to compile and work.

objfile... are the object files to be examined. When you specify archives, objdump shows information on each of the member object files.

Options

The long and short forms of options, shown here as alternatives, are equivalent. At least one option from the list -a,-d,-D,-e,-f,-g,-G,-h,-H,-p,-r,-R,-s,-S,-t,-T,-V,-x must be given.

 

-d--disassembleDisplay the assembler mnemonics for the machine instructions from objfile. This option only disassembles those sections which are expected to contain instructions.

 

 

 

 

출처 :

ko.wikipedia.org/wiki/Objdump

linux.die.net/man/1/objdump

 

 

 

+ Recent posts