본문 바로가기

2. Reversing (리버싱)/1) Write UP

[2021.05.15] reversing.kr , suninatas, xcz & 교재 6장(dll), 8장

Reversing.kr – Easy Crack

다운 받은 파일을 실행시키면 하나의 입력을 받아 확인한다. 틀렸을 경우 ‘Incorrect Password’라는 메시지 박스가 나타난다. password를 알아내야 하는 문제이다.

디버거로 파일을 분석해본다.

메시지를 입력 받는 함수를 호출한 직후 cmp명령어를 통해 ‘a’와 내가 입력한 값이 저장된 주소의 2번째 글자와 비교하고 있다. 즉 2번째 글자는 ‘a’인 것을 알아냈다.

 

그 다음 [esp+A]에는 2번째 이후의 글자가 저장된 곳인데, 이 글자와 5y가 담긴 주소 ‘406078’를 함수에 인자로 넣어 비교한다. 즉, 3번째, 4번째 글자는 5y  (_a5y)

분기문 통과!

그 다음은 보면 내가 입력한 5번째 글자부터 “R3versing”을 하나씩 차례차례 비교한다.

“EDX”가 내가 입력한 글자가 담기는 곳이고 EDX와 EBX를 비교한다.

5번째 글자는 ‘R’

jne 분기문을 타지 않고 명령어를 계속 실행한다.

그 다음 글자는 ‘3’과 비교한다.

이렇게 g까지 비교한다. _a5yR3versing 인 것까지 알아냈다.

그리고 “Congratulation!!” 을 출력하는 함수를 호출하기 직전 [esp+4] 주소, 맨 첫 번째 입력 값 ‘1’과 ‘E’를 비교한다.

맨 처음 글자는 ‘E’ 

답: Ea5yR3versing

-> Ea5yR3versing

입력으로 Ea5yR3versing을 주고 계속 실행하니 Congratulation!! 의 성공 메시지를 출력하는 흐름으로 이동한다.

정답!



xcz - Easy Reversing



성공문구 찾기

 

아래에 힌트 - jumps from 

 

따라가봄- ctrl g로 검색

실패말고 정답 출력되도록 수정!

 

f9로 실행




# CodeEngn Basic 20

 

CodeEngn Basic 20. 이 프로그램은 Key파일을 필요로 하는 프로그램이다.

'Cracked by: CodeEngn!' 문구가 출력 되도록 하려면 crackme3.key 파일안의 데이터는 무엇이 되어야 하는가

Ex) 41424344454647

 

 

들어가면 있는 이 JMP. &CreateFileA 가 아마 같은 폴더 내에 CRACKME3.KEY가 있는 지 검사하는 것 같다.

만약 그 KEY 파일이 없으면

이 성공분기문을 건너뛰기 때문에 파일을 메모장으로 만들어주었다.

 

 만들어주기

 

이 부분은 파일 내부를 읽어 크기가 12랑 같은지 검사하는 것이다. 0x12 (18바이트)여야 하기 때문에 18개의 글자 채워넣어주기

 

 

여기 402008을 넣어서 (1234~78)

call 20.401311 후 xor 하니

갑자기 숫자가 pppppppppzz~~z5678로 바뀌었다. 12345678이랑 xor 연산을 한건데 공교롭게도 내가 미리 해둔 키가 123456789~이거라서 pppppp이렇게 바뀐듯

 

더 진행해서 이 call을 실행하니까 EAX레지스터에 38373635가 담겼는데, 이는 방금 변환된 키 값의 마지막 4바이트 값인 것 같다(우연이면 유감)

cmp에서 eax(내 KEY의 마지막 4바이트)랑 dword ptr ds:[4020F9]랑 비교

여기에 뭐가 있는지 확인

딱봐도 다르쥬

마지막 4바이트는 어차피 안바뀌므로 고쳐서 다시 실행

그후 프로그램을 돌려보니 이렇게 성공 문구를 볼 수 있었다.

오! 그러니까, 18바이트이면서 뒤가 "P4인 KEY라면 Crack 되는 코드였다.

하지만 마지막 조건인 CodeEngn이 나와야 한다고 했으므로, 12345678과 xor 된 문구가 CodeEngn!이 되도록 해준다!

 

 

 

#suninatas 11번




실행파일을 실행시켰을 때 나오는 창이다. 등록 키의 값을 구하는 것 같다.

 

올리디버거에 올려서 text string 찾기를 해주었더니 congratulation!이 보였고, 이 부분 위로 특정 아스키코드 5개가 올려져 있는 것을 볼 수 있다.

해당 코드로 이동해서 한줄씩 실행시켜보니까 EDX에 2V->XS->B6->H1->0F 순으로 넣어서 처리를 하는 것 같았고, 등록키를 구하는 것과 연관이 있을 거라고 생각했다.

congratulation으로 가기 전에 있는 JNZ 때문에 등록키를 구할 수 없다고 판단을 했고, 그 위쪽으로 BP를 걸어주고 실행시켜 보았다.

JNZ 어셈블리어 바로 위에 있는 BP에 레지스터에 EDX에 특정 문자열이 들어가고 있다. 이것이 등록 키 값이 되겠고, 아까 2V->XS->B6->H1->0F 을 차례로 넣은것은 순서를 섞기 위해 아스키 값이 2개씩 들어간 것 같다고 추측된다 !

위에서 구한 값을 넣어주면, 메세지 박스에 인증 값이 나오게 된다.

저 메세지 박스에 있는 값도 올리디버거에서 확인할 수가 있고, JNZ를 NOP으로 채워주어도 문제가 풀릴것 같다는 생각이다.

 

교재 7.1장 DLL injection

원격 프로세스의 주소공간에 DLL을 강제로 로드 ->코드 실행 ->타깃 프로세스가 악의적인 동작 하도록 만듦

DLL 파일을 타깃 프로세스에 Injection 시키는 방법

- 레지스트리 조작: Windows: Gui 환경 ->user32.dll 호출 -> LoadLibrary() -> DLL 호출 -> 악성코드를 프로세스에 심을 수 있음

- setWindowsHookEX() API 사용: Windows OS에서 프로세스 동작하는 과정:OS와 이벤트 메시지 주고받음

->이 메시지 후킹함

- CreateRemoteThread() API 사용 (이걸 지금 이용할 것): 스레드를 만드는 함수

OllyDBG에 notepad.exe 올려서 파일분석: OEP ->F9 : 제어권을 OS로 넘기기 - 디버깅 옵션 설정

DLL = Windows에서 사용하는 동적 연결 라이브러리

EXE 실행 -> EXE 데이터가 M으로 올라감 + 필요한 라이브러리 로드(.dll 확장자)

DLL = 프로세스에 붙어서 기능 추가 or 도와줌

 

분석관점) DLL 파일: 독립적 동작X -> 실행주체 필요 -> OllyDBG는 DLL을 자동 로드

 

DLL Loader 직접 만들기 or rundll32.exe 활용 가능

 

DLL 파일은 분석해야 할 코드 위치가 어디인가?

1. DllMain() : EXE 파일 실행시 main() 코드 실행되듯, DLL은 DllMain() 코드 실행

-> 디폴트라 악의적 코드 여부 확인해야.

 

코드위치 따라 분석방법 달라짐

- 악의적인 코드가 DllMain에 존재 -> Argument 값으로 <”DLL 파일경로”>

-     Export 함수에 존재      ->                  <”DLL 파일경로”, Export 함수 이름>

 

교재 8장 파밍 악성파일 분석

* 805.exe ? 

- 파밍 악성코드 초기버전 : host파일 & hosts.ics 변조하여 악성행위 발생시킴

- DNS 서버에 IP를 쿼리하지 않고 정의된 IP로 접속

- 정상 URL을 입력해도 파밍 페이지로 접속하게 함

 

* 805.exe 분석

- FSG로 실행 압축 

- 004001D1 : OEP로 이동하는 주소

 

 

 

 

* 코드분석

- %root% 경로에 폴더를 만들고, 악성 DLL파일 생성

- DLL 파일 생성 : CreateFileA, SizeofResource, WriteFile

- DLL 파일 데이터 생성 : BeginUpdateResource, UpdateResource, EndUpdateResource

- 해당 폴더에 파일 생성 완료

- 이후 CreateProcessA로 DLL 파일 실행

 

 

* 쓰레드 분석

1. 백신 무력화 기능

 

ASDSvc.exe  -> V3Lite.exe -> AhnLab

AYRTSrv.aye -> ALYAC.exe -> ESTsoft

 

- 각 프로세스의 동작 여부로 제품이 설치되어 있는지 확인 ( strcmp )

- 드라이버 파일을 사용해서 무력화 & 데이터는 DLL파일 내부에 존재

- 드라이버 파일 생성 -> 시스템 드라이버로 등록 -> 동작 실행 -> 파일 삭제

 

2. 자동 보행 레지스트리 등록

DLL은 자신을 자동 실행 레지스트리에 등록 = OS 실행될때마다 동작

RegCreateKeyExA, RegSetValueExA API

 

 

3. hosts.ics 파일 다운로드

파밍 호스트 정보

1번 스레드가 실행된 후 대기 ( 파일 탐지 때문 )

http://174.139.177.252:805/plus.php” 접속 다운로드

폴더에 data.mdb 파일 생성

 C:\Windows\system32\drivers\etc\hosts.ics 로 복제

디렉터리 복제 후 mdb파일 삭제

www.naver.com 접속 => NATE 페이지로 접속 우회됨

  

4. 자신이 중복 실행되고 있는지 확인

중복 실행 ==> 코드 동작 중지 ( CreateMutexA )

WaitForSingleObject : 특정 IP로 DNS 쿼리 날려 3번 쓰레드가 동작중인지 판단

 

5. 공인 인증서 탈취

 

C:\Program Files\에 NPKI 폴더여부 확인

C:\에 7za.exe 생성 : 인증서를 압축파일로 만들어주는 파일

랜덤명 8자리 폴더 생성 후 인증서 복제 -> 7za로 인증서 압축

압축된 인증서 파일 데이터를 가져와 탈취