Timer 조작 실습환경 : VM - Window7 32bit 초급으로 실행시킨뒤 Ollydbg에 attach시켜보자. C:\Program Files\Microsoft Games\Minesweeper 폴더안의 파일을 직접 찾아도 됨. 디버거 타이틀을 살펴보면 보통 다른 thread와 module을 가리키고 있다. 우클릭 - select module - minesweeper을 선택해 바꾼다. SetTimer()함수를 찾아야한다. 우클릭 - search for - all intermodular calls 에서 dest name으로 정렬시켜 USER32.SetTimer()을 찾아낸다. BP를 걸고 F9로 실행시킨다. 게임이 동작하고 타일을 하나 클릭하면 다시 해당 BP에서 멈춘다. MSDN 3번째 ..
에러 메시지로부터 따라 들어가면, 일련번호 생성/검증 및 분기 로직 발견 kernel32.lstrlen() : 문자열을 입력받아 길이를 구해 eax에 결과 담는다. eax는 ecx로 들어가고, ecx는 뒤의 반복문에서 반복횟수로 사용된다. (DEC ecx : ecx는 1줄이고 연산결과가 0이면 ZF=1로 설정) [반복문] : 403038에 들어가있는 내가 입력한 id값 문자열을 다양한 연산을 거쳐 일련번호로 바꾼다. 최종연산결과는 esi에 담긴다. 생성된 일련번호(esi)와 내가 입력한 pw값(403138)을 비교해 분기가 나뉜다. 반복문 세부로직은 생략. 분기우회하면 위와같은 성공창 뜬다. 생성된 esi 일련번호는 hex상태이기때문에 ascii로 바꿔야한다. 구글을 통해 간단히 바꿔도..
MUP의 핵심은 OEP를 찾는것. OEP를 찾는법은 정답이 없고 다양한 도구와 기술이 있어, 다분히 경험적인 스킬이다. - Lena 'UnPackMe_EZIP1.0.exe' * ESP 레지스터를 활용한 OEP 찾기 entry point : 004650BE 진입후, 실행시 ESP에 PUSH EBP된 상태. 메모리에 HW Breakpoint를 걸자. esp - follow in dump - 첫번째 부분 데이터에 HW BP 적용 HW BP 확인 F9 실행시 00468687에서 HW BP걸림 근처에 JMP EAX 발견. 따라 들어가보면 다음과 같은 전형적인 코드를 발견할 수 있다. OEP = 004271B0 발견! (참고로, 재시작후 마찬가지로 F9실행시 총 2번 HW BP 걸림. 본 위치 P..
버튼 비활성화 상태 일련번호는 보통 문자열비교를 하므로, Search for - All intermodular calls - "vbaStrCmp" 발견 BP설정 Test DI, DI 결과에 따라 점프문 분기. 여기서 ZF를 0으로 바꿔 흐름을 바꾸면, Register버튼이 활성화된다. 클릭하면 다음과같이 성공 [분석] 역추적하면, TEST DI, DI는 DI값이 0인지 확인한다. DI값은 EDI의 하위16bit값. 그리고 이 DI는 vbaStrCmp()의 결과가 eax에 저장된후 다시 edi로 복사된다. vbaStrCmp()는 실행되며 인자로 eax, ecx를 넣는다. vbaStrCmp()부분에 BP를 걸고 다시 살펴보자. 재시작후 숫자를 하나 입력하면 BP가 걸린다. 이때 위와 같이, eax엔 0067..
[DLLInject.exe & MyHack.dll] DLLInject.cpp #include "stdio.h" #include "windows.h" #include "tlhelp32.h" #define DEF_PROC_NAME("notepad.exe") #define DEF_DLL_PATH("c:\\myhack.dll") DWORD FindProcessID(LPCTSTR szProcessName); BOOL InjectDll(DWORD dwPID, LPCTSTR szDllName); int main(int argc, char* argv[]) { DWORD dwPID = 0xFFFFFFFF; dwPID = FindProcessID(DEF_PROC_NAME); if (dwPID == 0xFFFFFFFF) {..
1. CreateFileA() MSDN OPEN_EXISTING => "abex.l2c"이름의 파일을 open한다. 없으면 eax=FFFFFFFF로 리턴되어 00401075로 점프 따라서 abexcm3.exe와 같은 경로에 "abex.l2c"이름의 파일을 만들어줘서 해당루틴 통과 2. GetFileSize() 파일사이즈를 가져와 12와 비교. 0x12는 10진수로 18이다 메모장 or HxD로 18byte로 파일사이즈를 조정
분기1) name값이 4자리 이상이면 eax가 0이고, 4자리 미만이면 FFFF..로 TEST AX, AX 연산을 통해 점프문 분기. 이후 반복문을 돌며, name으로 serial값 생성 (비트단위 반복 연산_생략) 분기2) - MOV DWORD PTR SS:[EBP-94],EAX EAX가 가리키는 값(serial값 ex.4444)을 스택 ebp-94에 복사한다. [memory] eax = 465AAC [stack] LEA 명령어를 통해 EBP-44,34의 주소값을 edx,eax에 복사한후, 스택에 push한다. 이후 함수를 호출하고, TEST AX AX 결과에 따라 점프분기한다. 역시 분기흐름을 임의로 바꿔주면 다음과같이 창이 뜨긴 한다. MOV vs LEA EBP = 0019F2B0 , EBP-88 ..
- Total
- Today
- Yesterday
- 해외여행
- 우아한 테크코스
- Android
- 리버싱
- dfs
- Android Studio
- OneToMany
- C
- brute-force
- Stack
- mysql
- Java
- webhacking.kr
- 회고
- Algorithm
- javascript
- 프로그래머스
- Data Structure
- graph
- bfs
- 웹해킹
- JPA
- socket
- sort
- 개발자
- FRAGMENT
- Vo
- git
- queue
- reversing
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |