반응형

 

Write-up 쓴 날짜 : 2022-09-22 15:24

 

VisualSite Designer.zip
2.01MB
patched_visualsite_designer1.exe
4.43MB
patched_visualsite_designer2.exe
4.43MB

 

lena가 이번 문제에서 의도하는 바는 아래와 같다.

1. number for Trial 10

2. 광고를 제거한다.

 

주제 - Comparing on changes in cond jumps, animate over/in, breakpoints


분석

 

 

Visual C++로 작성된 프로그램이다.

 

 

프로그램을 실행하면 위와 같은 화면이 나오는데, 위의 사진에서는 잘렸지만 화면 중앙 쯤에 노란색 버튼과 녹색 버튼이 있고 각각 "Buy now"와 "Start Program"이다.

 

그리고 왼쪽 하단에는 "Number of trials 10" 이라고 해서 횟수가 나와 있는데 이는 실행 횟수를 의미한다.

 

즉, 10번만 프로그램의 기능을 사용해볼 수 있다는 것이다.

 

 

녹색 버튼 "Start Program"을 누르면 위와 같이 웹 브라우저에서 coffeecup.com 사이트로 이동한다.

 

 

노란색 버튼 "Buy now"를 누르면 위와 같이 웹 브라우저에서 coffeecup.com 사이트의 store 페이지로 연결된다.

 

 

"Start Program"을 계속 눌러보니 위와 같이 뜬다.

 

html 삽입 기능
preview

 

위와 같이 HTML을 삽입하는 기능도 있고 글을 입력하는 기능도 있고 만든 걸 preview 할 수 있는 기능들도 있다.

 

 

프로그램을 종료하면 위와 같이 광고가 뜬다.

 

 

그리고 다시 프로그램을 실행해보면 위와 같이 9번 남았다고 뜬다.

 


1. number for Trial 10

 

 

위 사진은 EP 코드 부분이다.

 

이 프로그램은 이전 프로그램들과는 다르게 기능도 많기 때문에 코드의 양도 방대하다.

 

첫 번째 목적인 10번만 체험할 수 있는 것을 없애야 하는데

 

힌트가 될 만한 것이 없기 때문에

 

F8키로 하나 하나 over step 하다가 프로그램이 시작되는 어셈블리어 코드에서 BP를 걸고, 재실행해서 해당 BP 까지 실행한 뒤 F7키로 따라 들어가는 방법으로 한다.

 

 

F8 키로 한줄 한줄 따라가다보면 위와 같이 반복문을 만나는데 이런 반복문은 다 돌지 않고, 반복문이 끝나고 나서 실행되는 다음 어셈블리어 코드에 BP를 걸고 F9 키를 눌러 반복문을 빠져나간다.

 

 

즉, 4BD452 주소에 BP를 걸고 F9 키를 눌러 반복문을 빠져나간다.

 

 

이어서 F8 키로 진행하다가 4BD497 주소의 Call 명령에서 프로그램이 시작된다.

 

그러면 4BD497 주소에 BP를 설치하고 Ctrl + F2 키로 재실행 한 뒤 F9 키로 4BD497 주소까지 간 뒤 F7 키로 Call 호출 내부로 들어간다.

 

 

call 호출 명령어를 따라 들어가면 위와 같이 나오는데 4BD520 주소의 Call 명령어에서 프로그램이 시작된다.

 

그러면 4BD520 주소에 BP를 걸고 재실행 후 다시 4BD520 주소까지 F9키를 이용해 이동한 뒤 내부로 들어간다.

 

 

내부로 따라 들어가면 위와 같이 어느 곳으로 jmp를 한다.

 

 

점프하면 6C8D4ED0 주소가 나온다.

 

그런데  여기에 있는 코드는 Visualsite Designer 프로그램의 코드 부분이 아니라 dll 파일의 코드 부분이다.

 

VisualSite Designer 파일의 주소 영역은 400000번대인데, 여기는 60000000번대이다.

 

 

계속해서 F8 키로 진행하다보면 위와 같이 6C8D4F38 주소에서 esi에 있는 어떠한 함수를 호출함으로써 프로그램이 시작된다.

 

그러므로 여기에 BP를 걸고 재실행한 뒤 다시 오면 되겠지만 한 가지 문제점은 이 주소에 BP를 걸고 재실행하면 BP가 풀려있다.

 

그 이유는 이 주소 부분은 dll 파일의 주소이고, exe 파일의 주소 영역에 걸어둔 BP만 저장하기 때문이다.

 

그래서 일반 BP 즉, 소프트웨어 BreakPoint 말고 하드웨어 BreakPoint를 사용해야 한다.

 

software BP : 사람 눈에는 빨간색으로 주소 부분에 칠해져있지만 실제로는 가상 메모리 부분에서 직접 열어보면 0xCC(INT3)로 패치되어있고, 그 부분에서 멈춰서 보여지는 것이다.

 

hardware BP : CPU에서 거는 BP이고, 단점은 최대 갯수가 정해져있다.(4개) 

 

 

6C8D4F38 주소에 hardware BP를 걸고 재실행 후 F9 키로 다시 이 위치까지 온 뒤 내부로 따라 들어간다.

 

 

내부로 따라 들어가니 위와 같이 다시 Visualsitd Designer 파일의 영역으로 왔다.

 

 

계속 F8 키로 따라가기 힘드니 Ctrl + F8 키를 눌러 진행하면 자동으로 알아서 over step을 한다.

 

그러다가 위의 부분 489912 주소에서 멈추는데, 이 주소에 BP를 걸고 재실행 후 다시 이 위치로 온 뒤 내부로 따라 들어간다.

 

 

그럼 위와 같이 어느 함수 부분으로 점프를 하는데

 

 

따라 들어가면 위와 같은 코드가 나오고 이 영역은 dll 파일의 영역이다.

 

 

Ctrl + F8 키로 진행하다보면 위와 같이 6A400AD8 주소에서 멈춘다.

 

 

이 주소에 Hardware BP를 걸고 재실행 한 다음 F9 키로 이 위치까지 다시 온 뒤 내부로 따라 들어간다.

 

 

그러면 위와 같이 6A3EE150 주소로 온다.

 

 

스크롤을 조금 내려보면 PeekMessageA(), UpdateWindow(), SendMessage() 등 WinAPI 함수들이 보이는데

 

이 함수들이 보인다는 것은 이미 필요로 하는 작업은 다 마친 뒤, 사용자에게 입출력을 받는다는 것이다.

 

즉, 이미 이전에 실행 횟수 검사라던지 등의 작업을 마쳤다는 것이다.

 

 

그렇다면 API 함수들을 호출하기 전 마지막 Visualsite Designer 영역에서의 주소 부분으로 가야 하는데

 

대쉬('-') 키를 눌러서 이전 어셈블리어 코드로 돌아가다 보면 위와 같이 489912 주소가 마지막 Visualsite Designer  영역이다.

 

 

489912 주소의 call 명령을 실행하기 전 4898F1 주소에서 조건 분기를 하는데 4898E7 주소에서 eax에 값을 넣고 eax에 있는 값이 0인지 즉, edi + E4 주소에 있는 값이 0인지 검사하여 0이면 489998 주소로 점프하고, 0이 아니면 489912 주소의 call 명령을 실행하게 되어 Trial 문자열이 출력된다.

 

그렇다면 4898E7에 BP를 걸고 재실행한다.

 

 

재실행한 뒤 F9 키로 4898E7에서 멈추고, edi + E4 주소의 값을 보면 09이다.

 

 

디버거에서 실행하지 않고 Visualsite Designer 프로그램을 직접 실행하여 number of trials의 값을 8로 만든 뒤

 

디버거에서 재실행 하고 다시 4898E7 주소에서 멈춰 edi + E8 주소의 값을 보면

 

 

08이 담겨있다.

 

즉, edi + e8 주소에 있는 값은 시도 횟수이다.

 

 

4898EF 주소의 test 명령까지 실행하고, ZF 플래그의 값을 1로 한뒤 4898F1의 jle 명령을 실행한다.

 

 

그러면 489998 주소로 점프하고, Ctrl + F8 키로 계속 진행하면

 

 

위와 같이 뜬다.

 

시도 횟수를 모두 사용했다는 것인데

 

그렇다면 다시 4898E7 주소의 코드를 본다.

 

 

4898E7 주소에서 시도 횟수를 검사하기 전에 4898E1 주소에서 al의 값이 0이 아니면 489A29로 점프하라는 명령이 있다.

 

즉, 0이면,  시도 횟수를 체크하는 부분으로 가고, 0이 아니면 489A29 주소로 점프하라는 것이다.

 

 

4898E1 주소에 BP를 걸고 재실행 후 이 위치로 다시 와본다.

 

 

4898E1 주소에서 멈췄을 때 ZF 플래그의 값은 1이다.

 

 

이 부분을 0으로 바꾸고 F9 키를 눌러 실행해보면

 

 

Visualsite Designer 편집 창(?)이 뜬다.

 

 

그렇다면 디버거에서 재실행 후 4898E1 주소에서 멈춘뒤 위와 같이 jmp 명령어로 수정하고 남은 byte는 nop로 채운 뒤 패치된 파일을 저장하고 실행해보면

 

 

프로그램을 실행했을 때 바로 위와 같이 뜬다.

 

이로써 첫 번째 시도 횟수 부분에 대한 패치가 완료되었다.

 


2. 광고를 제거한다.

 

 

위에서 1번 패치가 된 파일을 디버거에서 연다.

 

 

F9 키를 누르면 바로 프로그램이 실행된다.

 

 

그리고 프로그램을 닫으면 위와 같이 광고가 뜬다.

 

광고가 뜬 상태에서 디버거에서 F12 키를 눌러 일시정지를 누른다.

 

 

그러면 위와 같이 DLL 파일 영역의 주소 부분 75E610CC에서 멈추게 된다.

 

 

그 상태에서 호출 스택 탭에 들어가면 위와 같이 함수 호출 스택이 보이는데

 

75E610CC 주소는 7AE24B05 주소에서 호출하고

7AE24B05 주소는 480C29 주소에서 호출한다.

 

70000000 번대 주소는 dll 파일의 영역이지만, 400000 번대 주소는 Visualsite Designer 프로그램의 영역이다.

 

 

480C29 주소에서 오른쪽 마우스를 눌러 "도착 따라가기"를 눌러 따라간다.

 

 

그럼 위와 같이 나오는데 480C24 주소에서 어떠한 함수를 호출한다.

 

480C24 주소에 BP를 걸고, 재실행 후 다시 이 위치로 와본다.

 

 

480C24 주소에서 멈추면 광고가 아직 뜨진 않는다.

 

하지만 F8 키를 눌러 480C24 주소의 Call 명령을 실행하면 광고가 뜬다.

 

그렇다면 480C24 주소를 패치하면 되는데, 함수를 호출하는 call 명령을 패치할 때

 

nop으로 채울려고 하면 스택을 잘 고려해야 한다.

 

 

위의 스택은 480C24 주소의 Call 명령을 수행하기 전의 스택 상태이다.

 

Call 명령을 수행하고 나서도 스택이 변화가 없다면 nop으로 채워주면 되지만, 스택에 변화가 생긴다면 스택이 변한 만큼 nop으로 채워줘야 한다.

 

 

위의 스택 상태는 480C24 주소의 Call 명령을 F8 키로 실행하고 난 뒤의 스택 상태이다.

 

스택의 변화가 없으니 그냥 nop으로 채워줘도 된다.

 

 

nop으로 패치하고 패치된 파일을 저장하고 저장된 파일을 실행하면 잘 실행되고 종료하면 광고가 뜨지 않는다.

 

 

반응형

'전쟁 > lena tuts4you' 카테고리의 다른 글

[Lenatuts4you] 7. MrBills  (1) 2022.11.02
[Lenatuts4you] 6. pcsurgeon  (0) 2022.11.02
[Lenatuts4you] 4. pixtopianbook107  (0) 2022.11.02
[Lenatuts4you] 3. ReverseMe  (0) 2022.11.02
[Lenatuts4you] 1. ReverseMe  (0) 2022.11.02

+ Recent posts