티스토리 뷰
[분석]
scanf로 입력받은 "123"과 "Asm07REC"를 strcmp로 비교함.
이후, ADD ESP 3C로 스택을 날리고
JNZ SHORT 690010F3에서 분기가 나뉜다.
- 자세히는, strcmp에서 두 문자열이 같으면 eax가 0으로, 다르면 FFFFFFFF로 돌아온다. 이후 TEST eax eax를 통해 ZF가 1/0으로 세트되고, JNZ문에서 ZF값에 따라 분기 흐름.
* Z Flag & JZ,JE,JNZ,JNE...
- Jump if Zero=Equal
- ZF=1이면 실행됨 (Zero Flag가 1(On)이라는건, "Zero라는것"="연산결과가 0이라는것")
- JNZ=JNE는 반대
* TEST [Operand1] [Operand2]
TEST연산은 두 피연산자를 AND연산하여 그 결과를 ZF에 반영한다.
두 값이 서로다른값이라도 결과가 0이 나올수있어, 두 값이 모두 0인 경우만 값을 단정할수있다.
따라서 본 연산자는 보통 "TEST eax eax"의 형태로, eax의값이 0인지 확인할때만 사용된다.
물론 연산결과가, eax가, 0이라면 ZF는 1로 / 1이라면 0으로 세트된다.
[우회법]
1. 가장 간단한 방법은, cmd에 key값으로 "Asm07REC"를 입력한다.
2. 단순히 JNZ를 JZ와 같이 변경 (Jmp문 패치)
3. Z Flag를 1로 변경해, 점프문 우회 (Flag 패치)
4. Nop으로 채워 그냥 넘어가기 (Nop 패치)
5. strcmp안으로 들어가 명령어 조작 (API 패치)
* API 패치
690010C9 : CALL DWORD PTR DS:[~.strcmp]를 follow로 Step into로 따라가면
다음과 같은 위치로 이동한다.
7C3505DC처럼 새로운 주소이고, FSC_Level1 => MSVCR71 module로 이동했음을 확인할수있다.
Process Explorer에서도 확인가능.
이제 이곳에서 코드를 수정하면 FSC_Level1.exe 원본의 코드수정없이 조작이 가능하다.
스택에 복귀주소가 들어간상태로 바로 retn하기위해, 간편히 7C3505DC위치에서 바로 명령어 조작하였음. "MOV EAX, 0", "RETN" 추가
[결과]
메모리 빈공간에 원하는 코드를 작성후, 메인코드의 빈공간에 교묘하게 내 코드로의 점프문을 심어, 내 코드로 이동후 retn 등을 통해 다시 메인코드로 돌아오면, 아래와 같이 프로그램 실행중간에 내가 원하는 동작을 수행할 수 있다.
아래는, 레지스터와 스택 값 등을 고려하지않고 무작정 점프시켜 "hello world"를 출력만 시켜보았음.
'Security&Hacking > Reversing' 카테고리의 다른 글
Reversing) abex crackme #3 (0) | 2019.09.11 |
---|---|
Reversing) abex crackme #2 (0) | 2019.09.11 |
Reversing) 기본 C문법 리버싱 (if문, for문) (0) | 2019.09.11 |
Reversing) CrackMe.exe v1.0 (Cruehead/MiB) (0) | 2019.09.11 |
Reversing) abex crackme #1 (0) | 2019.09.11 |
- Total
- Today
- Yesterday
- sort
- 프로그래머스
- 우아한 테크코스
- Java
- Vo
- C
- git
- reversing
- socket
- 리버싱
- Android
- OneToMany
- 회고
- dfs
- brute-force
- graph
- JPA
- Algorithm
- webhacking.kr
- bfs
- FRAGMENT
- Stack
- queue
- 개발자
- Android Studio
- 해외여행
- javascript
- 웹해킹
- Data Structure
- mysql
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |