블로그 이전했습니다. https://jeongzero.oopy.io/
[CodeEngn] Advance RCE L05
본문 바로가기
워게임/CodeEngn

[CodeEngn] Advance RCE L05

728x90

1. 문제


시리얼을 찾아야함

visual basic으로 만들어졌다.

2. 접근방법


vbc 엔진에서는 저렇게 RT_main을 간접호출함. 즉 msvbvm60.dll을 전용 엔진으로 하여 수행된다. 예를 들어 msgbox를 사용하고 싶으면 해당 엔진에 들어있는 rtcmsgbox 를 호출하게되고 그 내부에서 winapi인 messageboxa를 호출하는 식이다.

rtcMsgBox 에 bp를 걸고 확인해보면 저기서 걸린다. 정답이 아닌 값을 입력하면 저기서 msgbox가 호출된다. 따라서 분명 입력한 값과 비교하는 로직이 있을 것이다.

위로 쭉쭉 확인하다 보면 rtcMsgbox 를 또 볼 수 있다. !!!Bien 이라는 문자열이 출력되는 것으로 보아 의심스럽다. 저 mgsbox가 호출되려면 어느 분기를 타야하는지 또 위에서 확인해보자

바로 저기서 분기한다. bx와 di 레지스터가 달라야지 들어온다. 2바이트만 비교하는데 이상하다. 입력값에서 사실 2바이트만 체크하는건가? 일단 좀더 위에를 보자

위에서 vbaStrcmp 함수를 볼 수 있다. 저기에 bp를 걸고 이제 실제 뭐를 비교하는지 확인해보자

입력 값과, 677345랑 비교를 한다. 만약 1234라고 입력했을 때 strcmp의 결과값은 -1은 eax에 담기게 되고 이를 ebx에 복사한다. 그다음 neg ebx를 통해 2의 보수를 취하게 되고 값은 1이 된다

  • ebx : 1
  • sbb ebx ⇒ ebx - ebx - cf : -1

sbb ebx를 통해 ebx는 다시 -1이 되고 inc ebx를 통해 다시 0이된다.

0x402493 에서 다시 neg ebx를 통해 ebx는 결국 0으로 세팅되고 edi는 0이였기 때문에 bx와 di는 둘다 0으로 같게 되어 원하는 분기를 타지 못한다.

따라서 677345를 입력하게 되면

  • strcmp → eax : 0
  • mov ebx,eax // ebx = 0
  • neg ebx // ebx = 0
  • sbb ebx // 0 - 0 - 0 = 0
  • inc ebx // ebx = 1
  • neg ebx // 0xffffffff
  • ex = 0xff

3. 풀이


4. 몰랐던 개념


  • vbc engine 루틴
728x90

'워게임 > CodeEngn' 카테고리의 다른 글

[CodeEngn] Advance RCE L07  (0) 2021.02.02
[CodeEngn] Advance RCE L06  (0) 2021.01.30
[CodeEngine] Advance RCE L04  (0) 2021.01.28
[CodeEngine] Advance RCE L03  (0) 2021.01.27
[CodeEngine] Advance RCE L02  (0) 2021.01.26