티스토리 뷰

[분석]
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"를 출력만 시켜보았음.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함