콘치의 리얼리티 3000% 리버싱 튜토리얼 - 번외

By conchi | September 4, 2016

콘치의 리얼리티 3000% 리버싱 튜토리얼 - 번외



안녕하새오 콘치애오

우리 회사에 열라 짱 쎈분이 컴푸터는 간지랬는데 …

너무 간지나지 않는거만 한거 가타서

다시와써오 ㅎ_ㅎ 뀨뿌


는 구라고 ㅎㅎ

사실 이대로 끝내기엔 뭔가 아쉬운 구석이 없잖아 있어서 번외편으로 다시 나타났어여 헤헤 ㅎㅋㅎㅋㅎㅋㅎㅋ

처음 리버싱 시작할때는 막 엄청 간지나고 신기하고 막 스펙타클해보였는데,

제가 그동안 쓴글은 개똥같은 드립만 넘치고 별로 간지가 없더라구.

그래서 미천하지만 오늘은 작게나마 간지나는것(?)들을 알려드리고

콘치는 이만 리버싱 튜토리얼을 놔줄까 합니다 ㅠㅠ…

내손에서 계속 망가져가는거 같아 크흡




지난시간 까지는 뭔가 되게 간지나지 않고 어려움 냄새가 나는.. 핸드레이란걸 해봤어요.

오늘은 제가 만든 프로그램이 아닌 누군가가 만든 프로그램의 어셈블리 코드를 보고,

핸드레이를 해보고, 그 프로그램을 가지고 놀아볼 계획이에요.

저도 원본 소스를 알 수 없기 때문에, 뭔가 좀더 흥미진진해질거 같아여.

이번편에서 씹고 뜯고 맛보고 즐기기 위해서 아는분한테 프로그램을 하나 만들어달라고 했어여 ㅋㅋㅋ

꿀재미 예상해봅니다.


소오름!!!!!!!!!!!!!! 시작해볼까여 ?


> 분석 환경 및 사용한 프로그램 : Windows 7 32bit , ollydbg1.1



안녕하세여. 저는 그저 한낱 영롱한 실행파일만 가지고 있는 콘치에요. ㅠㅠ..

때문에 저는 제작자가 어떤 언어를 사용했는지,

어떤 컴파일러를 이용해서 컴파일한 프로그램을 나한테 줬는지 정말 아무것도 모르는 상태에여.

그래서 지금부터 문제 제작자가 어떻게 코딩해서 문제를 만들었는지,

그 문제를 해결하려면 어떻게 해야할지 한번 실행파일을 분해해서 알아볼 계획이에요.

껄껄 넘나 흥미롭져?


우선 이 프로그램이 어떤 동작을하는지,

우리가 실행하면 어떤 모습을 보여주는지부터 알아보기 위해 프로그램을 실행시켜 봅시다

(해당 프로그램의 동작을 확인하기 위한 작업이에요).



헐… 실행 시켰더니 나더러 크랙에 실패했다며ㅠㅠ 콘치를 우롱하는듯한 메세지 박스가 하나 뜨네요.

일단 진정하고 확인을 한번 눌러보겠습니다.

끠? 프로그램 종료된듯..? 아무것도 없졍.. ㅠㅠ;;;


그럼 이 건방진 프로그램 제작자를 조지러 갑시다.

가 아니라 ㅠㅠㅠ 한번 분석해봅시다. 후 인성나올뻔;

ollydbg 110을 실행시키고 문제의 conchiCrack.exe파일을 open해봤습니다.



흠.. 이거 어디서 많이 본 모양새인데… ‘ㅅ’…

혹시 기억나시나여?

우리 튜토리얼 3-1편에서 Visual Studio 2015 Community로 프로그램 만들고 컴파일 했더니 이렇게 JMP 범벅이었잖아여!!


기억안나시는 분들은 요 글을 참고해주세여 ㅋㅋ


오 혹시 이것도 Visual Studio를 이용해서 만든게 아닐까 추측해볼 수 있겠군요. (후후)

그리고 역시나 ASLR이 걸려있습니다. 프로그램을 다시 실행해줄때마다 주소가 바뀌는군요 ㅠㅠ 하 넘나.. 넘나한것..

하지만 요즘은 ASLR이 정말 기본중에서도 기본이니 너무 미워하지 말도록 해여껄껄(호탕한척 오짐;;)




자 그럼 분석하기에 앞서 아까 콘치가 실행했을때 프로그램이 어떤 반응을 보였었는지 가만히 생각해봅시다.


“Crack Fail Conchi” 라는 몽몽이응가 같은 문구를 띄우는 창이 하나 떴었죠.

기억해여? 그래서 콘치가 부들부들했었는데… 그 창의 이름은 WangConchi였구요.

하여튼 마음에 안드는 창이었어요.


우리는 여기서 힌트를 몇가지 얻을 수 있어요.


  1. 창을 띄우는 프로그램이다! 뭔가 창을 띄우는 함수를 썼을 것이다! 2. ”Crack Faiil Conchi” 라는 문자열이 나타났다!
  2. 확인 버튼을 누르니까 프로그램이 종료되었다!


이를통해 우리는 저 수많은 JMP명령어들 중 하나는 창을 띄우는 함수(혹은 API)나

Crack Fail Conchi라는 문자열이 있는 곳으로 우리를 보내줄 수 있을지도 모른다는 희망이 생겼어요.

지난번처럼 말이에요.


그럼 메세지 박스를 띄워주는 행동을 하는 함수가 없을까? 하고 생각하던 콘치는

Win32 API중에서 MessageBox라는 녀석이 메세지 박스를 띄워주는 역할을 한다는 사실을 떠올렸어요.

그 함수를 이용하면 아까 우리가 봤었던것 처럼 메세지 박스를 띄울수가 있지요.

그곳으로 JMP해주는 부분이 있다면, 우리는 제작자가 만든 소스코드에 대한 어셈블리를 알아낼 수 있을거에요!!


BUT.. 여러분들중 누군가는

“콘치님은 그런게 있다는걸 알았으니 바로 아 MessageBox라는 API를 떠올린게 아닌가요? 저는 그런말 처음듣는데여? 님 생각만 하지 마시져?”

하고 생각할 분들도 계실거에요.


저도 사실 처음엔 몰라서 그런 기능을 하는 API가 있는지 “c언어 메세지박스” 라고 구글에다가 쳐봤었어요.

실제로 많은 블로그들이 나오고 사용방법까지도 확인 할 수 있었어요.

그러니까 궁금하시면 한번 검색해보시길ㅋㅋ!! 따지러 오면 죽빵한대씩 ㅎㅎ


검색한 API의 경우 더 자세한 내용이 알고 싶으시다면 MSDN에서

많은 내용을 제공하고 있으니 심심하실때 구경들 한번 해보시길 바래여 :)


MessageBox에 대한 MSDN결과 링크는 여기를 참고해주세요 :)


이런한 혼돈의 과정을 거쳐 우린 이 프로그램에 MessageBox라는 API가 사용되지 않았을까 조심스레 추측해보았습니다.

그럼 사용되었나 한번 확인해봅시다.



JMP 어쩌구저쩌구 되어있는 부분의 빈곳에서 마우스 오른쪽 버튼을 눌러주시면

다음과 같은 창이 하나 뜨는데 거기서 Search for - All intermodular calls 를 눌러주세요.

버튼을 누르면 현재 프로그램에서 사용된 API들의 목록이 주르륵 나와염 ‘ㅅ’..



그럼 요런창이 뜰꺼에여. 그러면 우린 이 프로그램에서 사용된 API목록들을 확인해보면 되여.

아까 우리가 사용됬을것으로 추측되는 “MessageBox”라는 API가 존재하는지 확ㅇ…

맨위에 있네여 ㅎㅎ.. 긴장감 없게 맨위에 있고 난리지… ㅜㅜ..

더블클릭 하게되면 해당 API가 있는곳으로 슝 날아갑니다.



이렇게 말이에여 ‘3’ 헤헤 ㅎㅋㅎㅋㅎㅋ

와우 ‘0’.. 이렇게 보니까 뭐가 다 보이네여

아까 우리가 프로그램 시작하자마자 봤었던 “Crack Fail Conchi” 라는 문구도 아래쪽에 보이네요.

극혐..뽀낑…

얼레? 그런데 위에 “Crack Success Conchi”라는 문구도 있네요.

오잉잼


아주 수상한 냄새가 나네요.

왠지 제작자가 원하는 대로 한다면 Crack Success Conchi가 출력되었어야 했을듯 하네요.

그런데 ;;

우리 아까 그창에서 뭐 데이터도 못넣고 아무것도 못하지 않았나요?

내가 할수 있는거라곤 확인 버튼을 누르는게 전부였던것 같은데…

먼가 값을 조작하려면 어딘가에 데이터가 들어가는 부분이 있어야 하는데

없었어여 ㅜㅜ.. 미칭.. 뻐킹 ㅜㅜ


그럼 우리는 저곳으로 가기위한 개수작을 부릴 방법을 찾아야 할듯합니다.

왜냐면 전 Crack Fail Conchi 라는 문구가 넘나 마음에 안들거든여. ㅎㅎㅋㅋ


일단은 이 프로그램이 뭐하는 녀석인지 한번 어셈블리코드를 봅시다.

제작자가 어떻게 만들어놨는지 한번 핸드레이를 이용해서 이 문제가 뭔지 파악해보자구영 :3 헤헤




PUSH EBP

MOV EBP, ESP

SUB ESP, 0C0

PUSH EBX

PUSH ESI

PUSH EDI

LEA EDI, DWORD PTR SS:[EBP-C0]

MOV ECX, 30

MOV EAX, CCCCCCCC

REP STOS DWORD PTR ES:[EDI]


이쪽은 지난시간에 했던 핸드레이에 있는 부분과 똑같은 부분이에요.

혹시나 기억이 잘 나지 않는다면!! 지난글을 참고해주세요


XOR EAX, EAX

EAX = 0xCCCCCCCC


EAX와 EAX를 XOR연산 시켜라! 라는 의미를 가진 부분입니다.

(XOR연산에 대해 쉽게 이야기하자면 두 수가 같으면 0, 다르면 1을 반환하는 연산입니다.)

같은 두 값을 XOR연산 시키면 당연히 0이 반환되겠지요? 반환된 0은 EAX에 저장되게 됩니다.


▼ EAX = 0

JE SHORT conchiCr.002F1AB1


특정한 조건에 만족하면 해당 주소로 점프하는 점프문 중 하나입니다.

특정한 조건에 만족하면 002F1AB1여기로 강제 점프할꺼야!! 이런 의미가 되겠군요.


실제로 해당위치로 이동하여 한땀한땀 실행(F7) 해본결과, 해당위치로 바로 날아가버리더군요;

도착한 곳에는 크랙에 실패했다는 메세지박스를 출력해주는 함수가 존재했었습니다. ㄷㄷ;;; 헐?


MOV ESI, ESP


MOV 명령을 이용하여 ESP에 들어있는 무언가를 ESI에 옮겨둡니다.

ESP의 데이터를 다른곳에 백업해두는 작업인듯 합니다.

왜 ESP의 데이터를 백업해둬야 하는지, ESP가 어떤 역할을 하는지 조금 자세히 알고 싶으시다면 요 글에서 확인해주세요 :)


PUSH 40


PUSH conchiCr.0034FC88

PUSH conchiCr.0034FCA4

PUSH 0

CALL DWORD PTR DS:[<&USER32.MessageBoxW>]


첫번째 MessageBox가 나타났습니다.

해당 API에는 4개의 인자가 들어가나봅니다.

(지난시간 CALL명령어의 윗부분에있는 PUSH들을 주목하라고 했던말 기억나시나용)

스택 구조이기 때문에 가장 앞에 적히는 인자가 가장 나중에 들어가는것처럼 보이는군요.

이를 이용해서 요 부분을 복구해보면 다음과 같아요.


▼ MessageBox(0, conchiCr.0034FCA4, conchiCr.0034FC88, 40)


그럼 저기에 있는 두개의 주소는 뭘 의미하는걸까요 ‘ㅅ’? 궁금하지 않나염ㅎㅋㅎㅋ?

당장 msdn으로 날아가 해당MessageBox API를 검색해 보도록 해염.

(API의 경우는 앞으로도 자주 보게 될 것이니 평소에 관심있던 선배한테 자꾸 물어봐도 썸같은거 안 생기니까

그러지 마시고 msdn을 이용하여 검색하는 습관을 가지도록 합시다)

그러면 MessageBox함수에 들어가는 인자가 다음과 같음을 알 수 있어요.


▼ MessageBox(창에 대한 핸들, 메세지 박스 내용, 메세지 박스 제목, 플래그 및 아이콘 옵션)


대략 이런 모양새에요.

그러면 우리는


  • 핸들 == 0(null)
  • 메세지 박스 내용 == conchiCr.0034FCA4
  • 메세지 박스 제목 == conchiCr.0034FC88
  • 옵션 == 40


임을 알 수 있겠네요. 와웅!!

그러면 저위치에는 어떤 데이터가 들어있는지 한번 해당 위치로 날아가서 알아보도록 해염 슝슝!




해당 위치로 날아가서 데이터를 확인하는 방법은 다음과 같습니다.


  1. ollydbg의 화면에는 총 4개의 직사각형들이 존재합니다. 왼쪽 맨위의 상자에는 우리가 보고있는 어셈블리어들이 아쥬 낭낭하게 자태를 뽑내고 있구요. 그 아래쪽에 보면 어째 위의 어셈블리 코드창과 비슷하게 앞에 Address도 있지만 뭔가 알 수 없는 숫자들과 옆에는 ……이 난무하다가 개중에 알아볼수 있는 영어가 드문 드문 박혀있는 영역이 존재합니다. 바로 여기에요 여기.

  2. 어셈블리 창과 비슷해보이지만 다른 이곳은 해당 메모리주소에 어떤 데이터가 들어있는지 16진수와 아스키코드(ASSCII)로 표현되어있는 부분입니다. 우리는 요 부분에서 메세지 박스에 들어가는 메모리 주소에는 도대체 어떤 데이터가 들어있는지 한번 확인해볼거에요.

  3. 요 부분의 빈공간을 마우스로 한번 클릭해주시고 [Ctrl + G] 단축키를 눌러주시면 Enter expression to follow in Dump 라는 창이 하나 나타납니다. 요기다가 세번째 인자의 주소인 0034FC88 를 입력해주시고 OK 눌러주시면 끝이납니다.



짜잔!! 세번째 인자에는 WangConchi 라는 문자열이 들어가는걸 확인 할 수 있네요.

이런식으로 확인을 해보면 됩니댜 ‘3’!


CMP ESI, ESP


ESP와 ESI를 비교합니다.


CALL conchiCr.002EFEE2

0x002EFEE2에 있는 함수를 호출합니다. 0x002EFEE2에는 JMP conchiCr.002F1CD0 명령이 들어있습니다.

프로그램에 영향을 미치는 부분이 아니기 때문에 넘어갑니다.


JMP SHORT conchiCr.002F1ACE


002F1ACE로 점프합니다.

0x002F1ACE에는 XOR EAX, EAX라는 명령을 시작으로 프로그램이 종료되는 루틴으로 날아가는 부분입니다.


MOV ESI, ESP


ESP의 내용을 한번 더 ESI에 백업하는 부분이네요.




PUSH 40

PUSH conchiCr.0034FC88

PUSH conchiCr.0034FCD8

PUSH 0

CALL DWORD PTR DS:[<&USER32.MessageBoxW>]


두번째 MessageBoxW네요. 아까 했던 것과 마찬가지로 똑같이 해주시면 됩니다.


▼ MessageBoxW(0, conchiCr.0034FCD8, conchiCr.0034FC88, 40)


이렇게 되겠네요. 메세지박스의 제목은 아까 첫번째 주소와 동일한 걸로 보아 같은 제목이 아닐까 추측해 볼 수 있습니다.



위의 파란 부분이 0x0034FC88 에 들어있는 내용, 아래의 붉은 부분이 0x0034FCD8 에 들어있는 내용입니다.

그럼 위의 내용들을 조합해보면 다음과 같은 모습으로 복원할 수 있겠네요 !


▼ MessageBox(0, L”Crack Fail Conchi”, L”WangConchi”, 40);

CMP ESI, ESP


CMP 명령을 통해 ESI와 ESP를 비교하고 있네요. 백업되어 있는 값과 원래의 값을 비교하고자 하는 부분입니다.


CALL conchiCr.002EFEE2


다시한번 CALL 명령을 통해 0x002EFEE2의 내용을 호출해줍니다.


XOR EAX, EAX

POP EDI

POP ESI

POP EBX

ADD ESP, 0C0

CMP EBP, ESP


CALL conchiCr.002EFEE2

MOV ESP, EBP

POP EBP

RETN


그리고는 시작할 때 PUSH했던 부분들을 다시 POP해주고, 프로그램을 종료합니다.




그럼 우리는 위의 이런저런 내용들을 이용해서 다음과 같이 소스코드를 추측해볼 수 있겠군요.


#include
int main()
{
if(만족불가능한 조건)
MessageBox(0, L"Crack Success Conchi", L"WangConchi", MB_ICONINFORMATION | MB_OK)
else
MessageBox(0, L"Crack Fail Conchi", L"WangConchi", MB_ICONINFORMATION | MB_OK)
return 0;
}


이렇게 말이에요.



여기서 몇가지의 의문이 생기겠죠?


의문 1. 왜 if문이 나타났는가.

의문 2. 마지막 인자는 40이었는데 어떻게 저렇게 표현이 가능한가.


의문 1에 대한 대답은 JE 명령이 될 수 있겠네요.


JE명령은 특성상 특정한 조건에 만족해야 다음 명령으로 이동을 하는 녀석입니다.

JE 명령이 사용되었다는건 특정한 ‘조건’이 사용되었다는 것을 알 수 있게해줍니다.

하지만 우리의 프로그램에서는 JE명령을 만났을때 모른척 넘어가지 않고 JE명령 자체가 그대로 실행버렸고

(그래서 JE 명령을 이용해 Crack Fail Conchi 창이 출력되는 부분으로 점프하게 되었던거에요)

해당 부분은 크랙이 실패했다는 메세지를 띄우는 부분이었습니다.

따라서 우리는 정상적으로 크랙이 성공했음을 알리는 부분으로는 갈 수 없었습니다.

특정한 조건을 만족하지 못했기 때문에 JE명령을 지나칠 수 없었던거죠. ㅠㅠ…

메ㅔㅔㅔㅔㅔㅔㄴ붕ㅇㅇㅇㅇㅇㅇㅎ0ㅎ! 어쩌징 ㅋㅋㅋㅋㅋㅋㅋㅋ


노답인 의문 1번은 잠시 던져두고 의문 2에 대해 생각해봐여.

위에서 말씀드렸던 MSDN에서는 API의 역할 뿐만 아니라 각 API에 들어가는 인자에 대한 정보도 알 수 있어요!!!

이말은 즉슨 MSDN이나 검색하면서 알아서 찾아보란 이야기에여.

하지만 오늘은 내가 기분이 좋으니 ^0^ 알려드릴게여



여길 보시면 0x00000040L은 MB_ICONINFORMATION 이라는 옵션을 가져요!! ㅎ0ㅎ!!

그런데 아까 우리 확인버튼도 있었던거 같은데…?



은 OK버튼은 0이셈ㅋㅋㅋㅋㅋ 개이득

그래서 콘치는 마지막 인자를 저렇게 추측해서 적어보았습니다.

이렇게 소스코드를 만들어 보니 좀 간지가 나는군요 ㅎㅋㅎㅋ


끝!




은 무슨 이제부터가 시작이에여 ㅋㅋㅋㅋ

우린 그렇다면 영영 Crack Success Conchi를 볼 수 없는건가여 ㅠㅠ? 는 무슨 아니에여

우린 제작자의 의도와는 다르게 Crack Success Conchi 창을 뜨게 만들꺼에요.


바로 UI도 별로고 뭐가 뭔지 죵내 어렵기만 한 Ollydbg로 말이에요 :)! !!

복원한 소스코드를 한번 다시 볼까요?


#include
int main()
{
if(만족불가능한 조건)
MessageBox(0, L"Crack Success Conchi", L"WangConchi", MB_ICONINFORMATION | MB_OK)
else
MessageBox(0, L"Crack Fail Conchi", L"WangConchi", MB_ICONINFORMATION | MB_OK)
return 0;
}


우리가 예상하는 프로그램의 구조는 다음과 같았습니다.

절대로 if문을 만족시킬 수 없어서 정상적인 방법으로는 Crack Success Conchi라는 메세지 박스를 출력 할 수 없었죠.


그러면 저부분을 조작해서 if문 안으로 강제로 들어가면요?


??????????


뭔 dog소리냐구요? 다시다시


ollydbg를 이용하면 우리눈에 보이는 저 어셈블리를 손쉽게 수정할 수 있어여.

우리는 이런 고오오오급진(?) 기능을 이용하여 제작자의 의도와는 전혀 상관없이 요 프로그램을 맘대로 수정할 수 있답니다. 0!!


그럼 수정해야할 포인트는 잡혔고.. 어셈블리 코드에서 어느 부분을 수정해야할지 알아봅시다.



우리네 어셈블리는 회색으로 잡혀있는 부분을 지나면서 강제로 내 뜻과는 상관없이

아래쪽의 어셈블리는 실행시키지 않고 빨간영역으로 날아가 마치 내 인생이 실패한것을 알려주기라도 하는 마냥

크랙에 실패했다는 메세지를 날려주었죠. ㅎㅋㅎㅋ 이 불쾌한 부분을 조져봅시당.

방법은 정말 천차 만별이에요.

어쨌든 저 점프문중 하나인 JE만 우회해주면 되는거니까요!


머리아프게 생각할것도 없이 JE의 주소를 바꿔볼까요?

현재는 JE SHORT conchiCr.002F1AB1로 되어있는데 이부분을 바로 다음주소인 0x002F1A92로 바꿔봅시다.


어셈블리를 수정하는 방법은 넘나 간단합니다.

걍 바꾸고 싶은 부분을 광클하시면 되여.

그러면 [Assemble at 광클한 부분의 주소] 라는 제목을 가진 창이 하나 뜨고 현재 주소에 쓰여져 있는 어셈블리가 적혀있는게 보일거에요.



그러면 다른건 건들지 마시고 다음과 같이 뒤쪽의 주소만 바꿔주시고

Fill with NOP’s는 체크 풀어주시고 Assemble를 눌러주시면 됩니다.


+)Assemble를 누르면 다음줄로 회색이 넘어갑니다.

Assemble한번 더 누르면 다음줄도 바뀌어 버리니 그런 끔찍한일이 일어나지 않게 현재 어디를 수정중인지 잘 보고 Cancel해주세요.


+) Fill with NOP’s는 NOP(아무것도 없는 상태, 아무것도 실행하지 않는 빈공간)을 삽입할 때 사용되는 녀석입니다.

요걸 체크하고 Assemble를 누르게 되시면 수정된 코드 아래쪽에 NOP 공간이 삽입됩니다.



요로코롬 수정된 부분은 아마 빨간색이 되었을거에요.

요 빨간 부분을 한번만 살짝 눌러주고(더블 클릭하면 다시 수정하는 창 뜹니다 ㄷㄷ;;) 오른쪽 버튼을 눌러보면

Copy to executable라는 부분이 존재합니당 ㅋㅋ

마우스 가져가 보면 Selection버튼이 살포시 숨어있다가 나타나여.

그거 눌러주세염

그러면 창이 하나 더 등장하게 되는데 그 창 빈공간에서 마우스 오른쪽 버튼 누르면 Save file라는게 보일꺼에요.

그거 누르면 저장할 위치와 저장할 이름을 설정하는 익숙한 창이 등장합니다. ㅋㅋㅋㅋㅋ헤헿헤헿헿



짜잔!! 어셈블리 코드를 수정해버린!! 새로운 파일이 생성되었슴댱(파일 이름은 무시하세여 정신승리 중임)

그럼 요 파일을 한번 실행해볼까염 둑흔둑흔!!


꺄르륵꺄르륵> <!

제작자의 의도와는 상관없이 제맘대로 크랙에 성공했다는 메세지를 출력하게 만드네요 !! +_+!!

아무래도 우리의 작업은 성공적으로 이루어 진듯 합니다. 헤헿 !!

요런식의 어셈블리 코드를 수정해서 우리는 제작자의 의도와는 다른 행동을 하게 할 수 있습니다.

이렇게 수정하는 작업을 ‘패치’라고 합니다 ‘3’ ㅋㅋ


요런 작업들을 이용해서 프로그램의 버그를 수정하기도 하고, 새로운 기능을 추가하기도 한다네요.

헤헤 :3 리버싱을 하다보면 자주 사용되는 기술(?)이니 알아두는게 정신건강에 이로울거에여.

ㅎㅋㅎㅋㅎㅋㅎㅋㅎㅋㅎㅋㅎㅋㅋㅋㅋㅋㅎㅋㅎㅋㅎㅋ :3




하나만 하면 먼가 아쉬우니 ㅋㅋㅋㅋㅋㅋ 몇개 더해볼까여 ‘3’?!!

뭘해보징 ‘3’… 음..


저 불쾌한 메세지 박스나 지워볼까여?ㅋㅋㅋㅋ??

위의 방법들을 이용하여 다시 메세지 박스가 있는곳으로 와 봅시당 :)



흠.. 어딜 조져야 짜증나는 메세지 박스가 뜨지 않을까 고민을 하던중에 가만보자..

메세지 박스 API를 호출하는 부분을 날려버리면 어떻게 될까 하고 생각하게 되었어요.

그러다 보니 메세지 박스를 호출하는 부분과 더불어..

그냥 그부분을 아예 없애버리면 어떨까… .. 해피엔딩각인데… 라고 생각했답니다.



그래서 생각난김에 다 없애버렸어여 0!!

아참, 저기 보이는 NOP는 그냥 있는부분이 아닙니다. 다 콘치의 빅픽쳐를 위해 존재하는 부분들이에염. :3


저부분은 아까까지만 해도 인자들과 MessageBox API가 호출되던 CALL명령이 있던 부분들이에여.

그부분 만큼의 크기를 모두 NOP로 채운거시죠.

아 뭐.. 사실.. JMP명령이 맨위에 있기 때문에 저 부분들을 지나가지 않고 바로 0x01031AC7로 날아가겠지만여 ㅎㅎ..

그냥.. 내눈앞에서 사라져버렸음 했어여 ㅎㅎㅋㅋ…


이번 코드에서는 NOP가 사용되지 않지만, 임의로 NOP코드를 넣어야 할땐 Fill with NOP’s 를 체크해서

꼭 원래 어셈이 자리하던 공간만큼 NOP를 채워야 해여.

그래야 별 무리없이 프로그램이 잘 돌아갑니다.


생각해보세여.

뭔가 동작을 안하게 하려고 NOP를 넣어버리는건데..

특정한 어셈이 차지하고 있던 공간이 5였는데 NOP는 1만큼밖에 안들어갔다면?

나머지 4를 지나갈때 프로그램은 어떻게 될까여 ‘ㅅ’…ㅎㅋㅋ… ?


아마도 님들이 원하는대로 호락호락하게 돌아가지 않을거시다.


(????)


녜 ㅇㅅㅇ..


그럼 그 공간을 계산해야하나.. 그것도 아닙니다.

그럴때 필요한게 바로 Fill with NOP’s에여. 이거 체크해주면 지가 알아서 계산해서 NOP로 다 채워줌.. 레알..개꿀팁…

어셈코드 바꾸실때도 뭐 아까처럼 단순하게 뒤에 주소만 바꾸고 하는게 아니라 어셈을 막 통으로 바꾸고 해야할때 써주시면

자기가 알아서 NOP를 남은 공간에 맞춰서 채워주니 이런게 바로 개꿀팁이 아니겠습니까 여러분!!!!


BUT!


지금 당장은 무쓸모합니다 호호 0!! 제가 그렇게 코드를 패치했거든요 ㅋㅋ… ㅎ…ㅋ..

지금 봐야할 부분은 JMP 명령어 입니다. 없던게 생겼네여. 제가 넣었어여 ㅎㅎ…

JMP명령은 프로그램이 종료되는 지점인 0x01031AC7을 가리키고 있습니다.

(주소가 자꾸 바뀌네요 이런 망할놈의 ASLR… 같은프로그램이니 오해 노노행)

요렇게 수정한 코드를 저장하고 실행해보겠슴당 ‘3’ ..


백날 더블클릭해도 아무런 반응이 없습니다.. ‘3’..모징..

이렇게 메세지 박스를 없애버렸습니다. (?)

(그렇다고 아예 실행이 안되는건 아니에요. 까만창이 빠르게 떴다가 사라지거든여 ㅋㅋ호호)

뭐지..

뭔가 넘나 시시해보이는것..

간지가 없어여 간지가… 겐지 아님..간지임.. ㅎ.. 겐지할줄모름.. 개인적으로 개싫어함..




그럼 메세지 박스의 내용을 한번 조작해서 콘치의 심기를 건드리지 않게 해보는건 어떨까요.

다시 원본 프로그램(conchiCrack.exe)을 실행시켜 메세지 박스가 있는곳으로 가줍시다.

그리고 인자들이 담겨있는 부분을 PUSH하는 주소들로 이동해주세여.

(어셈블리 코드가 있는곳 아래쪽에서 인자들이 담겨있는

주소 부분으로 찾아가면 어떤 데이터가 담겨있는지 확인이 가능했었습니댱 ‘3’ ..!! )


요 부분을 노리는거에여.



Crack Fail Conchi라고 ASCII코드로 나와있는 부분 옆쪽의 Hex dump영역을 쭈우우우욱 드래그하시면 저렇게 회색영역이 만들어지는데,

이렇게 영역을 만드신 후 스페이스바를 꾹 눌러주시면 이렇게 이 영역을 수정할 수 있는 창이 뜹니다.

이제 요기다가 뭐라뭐라 적어볼게영 :3



아래쪽의 HEX ++00이라고 되있는 부분에 존재하는 데이터들은 문자열로 표현하기 위한 ASCII값들입니다. 요 부분을 수정해주세여 :3


ASCII코드표는 인터넷에 검색하면 겁나 많이 나오니 아무거나 하나 보면서 치면 됩니당 ㅋㅋㅋ

저는 HELLO Conchi 라는 Message Box에 출력되었음 해서 바꿔보았어여 :3 ㅋㅋㅋ

요렇게 바꿔주고 위에서 수정한 어셈코드를 저장하던것과 마찬가지로

[수정한 부분 드래그] - [Copy to executable file] - [쪼마난 창이 하나 뜸 ] - [ 마우스 오른쪽 버튼 누르고 Save file]

이렇게 해서 저장해주면 대영 ㅋㅋㅋㅋㅋ 이젠 넘나 쉬운것 ‘3’



그렇게 만들어진 파일은 이런 메세지 박스를 출력합니당 ㅜㅜㅜㅜ

넘나 감동적인것… ㅜㅜㅜ

(그와중에 까먹고 띄어쓰기 안함 ㅋ… 바보잼..ㅋ )




뭐 이런식으로 우리는 conchiCrack.exe를 씹고 뜯고 맛보고 즐겨보았습니다.


사실 이번 번외편을 준비하면서 콘치는 많은 생각을 했답니다.

이걸 보고 철없는 뻐킹닝겐들이 상용프로그램(!!)같은걸 대상으로 따라해보고 그러면 어쩌지;;;

나 리버싱할줄안다! 하고 자랑하면 어쩌지…;;;


저작권자(혹은 개발자, 제작자)에게 인가 받지 않은 상태에서 프로그램에 대한 리버싱은 범죄입니다 여러분.


자세한 사항은 이 문서를 꼭 한번 읽어보시길 바랄게요.


저의 경우는 이 프로그램을 만들어준 제작자에게 님이 원하지 않는 방향으로 크랙해도 되나요 하고 양해를 구했고 제작자도 허락한 케이스입니다.


”??나는 나쁜 의도로 한게 아니에여 ㅠㅠ 공부하려고 그랬다고요 ㅠㅠ 공부하다가 실제 응용프로그램에 대해서 키젠도 만들어보고 크랙도 해봤다구요 ㅠㅠ “



멀리 안나가요 ~~~

어떤 목적을 가지고 리버싱을 공부하는지는 정말 사람 하나하나 마다 다 다르겠지만

그목적이 나쁜목적이 아니길 콘치는 바라고 또 바랄 뿐입니다 :)




해보고싶다!!!! 분노가 차오른다!!! 그럼 난 어디서 리버싱 연습을하나여 !!!!!!!!

http://reversing.kr/ 혹은 유명한 Abex crackme 시리즈나 keygen me 시리즈들을 검색해서 해보시면 재밌을거에요.


이렇게 콘치의 리버싱 3000%도 끝이 났네여 :)

최대한 지루하지 않게 재밌게 쓰려고 노력해봤는데 어째 다들 재밌게 읽으셨나 모르겠네여.


사실 나님은 이상한 사람이 아닙니다.

지극히 정상적이에여

말했어여

저 완전 정상적임 ㅎㅎ

레알..


그냥 이말을 꼭 하고싶었음..


페친은 걸지마셈 ㅎ 안받아줌ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


그럼 난 이만 ‘ ㅅ’


정신없는 콘치 따라오느라 다들 고생했져여 다음시리즈도 기대해주셈ㅋㅋㅋ안농!


comments powered by Disqus