BaaaaaaaarkingDog
코딩, 해킹
[Reversing.kr] Easy Unpack

OEP를 찾으라네요. packing이 되어있더라도 어쨌거나 프로그램이 실행이 되어야하기 때문에 언젠가는 난독화되어있는 부분의 난독화가 풀리고 OEP를 찾을 수 있을 것입니다. Ollydbg로 까봅시다.

패킹되어있는 이 프로그램의 EP는 40A048번지입니다. 언젠간 난독화가 해제될테니 쭉쭉 진행하다보면..

401150번지로 점프합니다.


이건 대체 뭐하는 곳인가 싶겠지만, 사실 이 곳은


OEP입니다!!(우클릭->Analysis -> Analyse code)

OEP는 401150번지네요.



'워게임 > Reversing.kr' 카테고리의 다른 글

[Reversing.kr] Position  (0) 2017.12.30
[Reversing.kr] ImagePrc  (0) 2017.12.29
[Reversing.kr] Replace  (0) 2017.12.29
[Reversing.kr] Music Player  (0) 2017.12.29
[Reversing.kr] Easy Unpack  (0) 2017.12.29
[Reversing.kr] Easy Keygen  (0) 2017.12.29
[Reversing.kr] Easy Crack  (0) 2017.12.29
  Comments
댓글 쓰기
[Reversing.kr] Easy Keygen

프로그램은 무난하게 생겨있습니다.


Ollydbg로 까봅시다.


입력받는 부분, 그리고 맞았는지 틀렸는지 확인하는 부분을 쉽게 찾을 수 있습니다. 이제 값이 어디에 입력되는지, 맞았는지 틀렸는지를 어떻게 판단하는지 천천히 확인하면 되겠네요.


여기서의 입력은 19FE14번지부터 들어가게 됩니다.


그리고 키를 입력하기 전 수상한 루프가 하나 생기는데, 이 부분에서는 매 루프마다 ESI가 0 1 2 0 1 2 0 1 2... 이렇게 바뀌어가고 이 값에 따라 ECX에는 10 20 30 이 반복해서 들어갑니다. 그리고 EDX에는 EBP가 1씩 증가해서 내가 입력한 input이 한 글자씩 차례로 들어갑니다. 그러고나서 ECX에 EDX값을 XOR하더니 ECX와 EAX(=19FE7C라는 주소)를 스택에 넣고 ECX에 19FE7C를 넣고 다시 스택에 넣습니다. 느낌상 저 함수는 sprintf이고 19FE7C번지에 %s%02X로 인자를 주는데, %s 되는 부분은 자기자신이고 %02X는 ECX와 EDX의 XOR 값입니다. 즉 name의 한 글자씩을 떼서 10 / 20 / 30을 차례로 XOR시켜 19FE7C에 기록하네요.


Serial key는 19FE18번지에 저장됩니다.


이제 ESI에 19FE7C번지(이름과 10 20 30을 XOR해서 얻어진 값이 저장된 곳)를 두고 EAX에 19FE18번지(serial이 저장된 곳)를 둡니다. 그리고 ESI가 가리키는 곳(CL), EAX가 가리키는 곳(DL)이 0이 될 때 까지 ESI와 EAX가 같은지 비교하며 값을 증가시킵니다. 만약 전부 같다면 EAX가 0인 채로 401113번지로 점프, 같지 않은 곳이 있다면 EAX는 1이 되어 401113에 도달합니다. 이후 TEST EAX, EAX에서 EAX는 1인 경우 Wrong으로 가고, 0인 경우 Correct가 됩니다.


즉 19FE7C번지와 19FE18번지의 값이 같은지를 확인하는 명령이었네요. 그러면 최종적으로 답은 시리얼 5B134977135E7D13에 차례대로 10 20 30을 XOR한 값이 되겠습니다. 파이썬으로 대충 짜면 아래와 같습니다.(Python 3)



serial = '5B134977135E7D13'
val = [0x10,0x20,0x30]
for i in range(len(serial)//2):
  print(chr(int(serial[2*i:2*i+2], 16) ^ val[i%3]), end = '')

'워게임 > Reversing.kr' 카테고리의 다른 글

[Reversing.kr] Position  (0) 2017.12.30
[Reversing.kr] ImagePrc  (0) 2017.12.29
[Reversing.kr] Replace  (0) 2017.12.29
[Reversing.kr] Music Player  (0) 2017.12.29
[Reversing.kr] Easy Unpack  (0) 2017.12.29
[Reversing.kr] Easy Keygen  (0) 2017.12.29
[Reversing.kr] Easy Crack  (0) 2017.12.29
  Comments
댓글 쓰기
[Reversing.kr] Easy Crack

다운받은 프로그램을 실행해보면 위와 같습니다. 아무거나 입력하고 확인을 누른다면..


비번이 잘못됐다고 하네요. 올바른 비밀번호를 알아내면 flag를 주거나, 아니면 그 비밀번호 자체가 flag일 것 같습니다. 고민할 필요 없이 Ollydbg로 까보면 시작점은 401188번지이고 401114번지부터 실패, 성공 메시지가 있음을 확인할 수 있습니다.


저 부근에 있는 조건문들을 확인해서 어떤 경우에 실패로 빠지는지를 봐도 되지만, 간단한 프로그램인 만큼 실제로 프로그램이 어떤 구조를 가지고 있는지 최대한 꼼꼼하게 분석을 해보겠습니다.


401188번지부터 F8(step over)을 누르면서 한 칸씩 가다보면 401250번지까지는 별 변화가 없다가 401251번지에 도달해서 창이 뜨는 것을 볼 수 있습니다. 401251번지에서는 401000번지의 함수를 CALL하니 F7(step into)로 들어가봅시다.

401000번지의 함수에서는 DialogBoxParamA라는 함수를 실행합니다. DialogBoxParamA 함수는 https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms645465(v=vs.85).aspx 에서 어떤 함수인지 볼 수 있는데, 봐도 잘 이해가 안갑니다. 큰일입니다. F7로 저 함수 내부에서 어떤 일이 벌어지는가를 보려고도 했으나 빠르게 포기했습니다. 잘 이해는 안가지만 401020번지로 이동한다는 사실만 알기로 스스로 타협했습니다. 그러면 이제 401020번지를 보겠습니다.


이제는 401080번지로 가네요. EAX에 3F06FE라는 값이 담겨있고, 이걸 인자로 전달하지만 현재로서는 조금 불명확합니다. 401080번지를 확인해봅시다.


이제 조금 살 것 같습니다. 딱 봐도 비교루틴같네요. 천천히 따라가봅시다. 그러면 4010AA번지에 GetDlgItemTextA를 call하는 것을 확인할 수 있는데요, https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms645489(v=vs.85).aspx 에서 확인해보면 저 함수는 EAX가 가리키는 주소에 최대 0x64바이트까지 Dialog에 써져있는 내용을 옮기는 것입니다. ControlID 0x3E8은 식별자 역할인 것 같은데 이 프로그램에서 실행된 Dialog 창은 1개밖에 없으니 우리가 입력한 비밀번호일 것이라고 생각해도 무방해보입니다.


EAX에 저장되는 주소는 ESP+8 = 19F718번지입니다. 실제로 0123456789를 입력했을 때


이렇게 19F718번지부터 쌓이는 것을 확인할 수 있습니다. 그렇다면 어떻게 올바른 키를 만들어낼 수 있을까요?


1. 4010B0번지를 확인해봅시다. [ESP+5] (19F719번지에 적힌 값)와 61(a)이 일치하는지 확인하고, 일치하지 않는다면 Incorrect Password로 가버립니다. 그러므로 일단 두 번째 글자는 a여야겠네요.


2. 401150번지의 함수에 인자 (2, "5y"의 주소, ESP+A(19F71A번지, 즉 세 번째 글자의 주소))를 보내서 그 return 값이 0이 아니면 Incorrect password로 가버립니다. 401150번지의 함수를 확인해보면 문자열 비교 함수입니다.


3. 다섯번째 글자부터 이어지는 문자열과 "R3versing"을 비교합니다.


4. 40110D번지를 확인해봅시다. [ESP+4](19F718번지에 적힌 값)와 45(E)가 일치하는지 확인합니다.


이 4가지를 전부 통과하면 Conguratulation을 얻을 수 있습니다.



그러므로 키는 Ea5yR3versing 임을 알 수 있습니다.


엄청 복잡한 프로그램은 아니지만 그럼에도 불구하고 하나하나 분석하려고 하니까 생각보다 꽤 어렵네요. 앞으로는 적당히 건너뛸건 건너뛰어야겠습니다.

'워게임 > Reversing.kr' 카테고리의 다른 글

[Reversing.kr] Position  (0) 2017.12.30
[Reversing.kr] ImagePrc  (0) 2017.12.29
[Reversing.kr] Replace  (0) 2017.12.29
[Reversing.kr] Music Player  (0) 2017.12.29
[Reversing.kr] Easy Unpack  (0) 2017.12.29
[Reversing.kr] Easy Keygen  (0) 2017.12.29
[Reversing.kr] Easy Crack  (0) 2017.12.29
  Comments
댓글 쓰기