-->

[CodeEngn] Basic RCE L09 풀이 (StolenByte)

CodeEngn Basic RCE L09 문제 분석

이번 문제는 StolenByte를 구하는 문제이다.

 

 

StolenByte는 이 문제에서 처음 들어봐서 구글링해보니, 일종의 안티디버깅 기법이라고 한다. 의미 그대로 일부 코드 조각을 훔쳐서 다른 부분으로 옮긴 것인데 주로 OEP 주소의 코드를 따로 분리해서 OEP로 점프하기 직전에 push로 넘겨준다고 한다.

 

따라서 OEP를 찾아서 덤프를 떠서 언팩했다고 생각하고 실행하려고 하면 실행이 되지 않는 것이다. OEP의 옵코드 몇바이트가 JMP 직전에 있었기 때문에 OEP로 코드 조각이 오지 못했고, 예를 들어 함수의 인자값에 대한 push 옵코드였다면 함수의 인자가 충분하지 않으므로 실행에서 에러가 나게 되는 것이다. 이런 경우 소위 SolenByte라고 하는 옵코드를 찾아서 실행코드 부분에 복원을 해준 다음 언팩을 해주어야 정상 실행이 가능하게 된다.

 

 

CodeEngn Basic RCE L09 풀이

그렇다면 OEP로 점프하기 직전에 이상한 코드가 없는지, OEP 근처에 이상한 코드가 없는지 살펴보자. popad로 오자마자 이상한 코드가 보인다. 갑자기 전에 없던 push가 보인다. 문자열이 포함되어 있는 것으로 보아 메시지박스를 구성하는 인자인 것 같다.

 

 

 

맞는지 OEP로 점프를 해보니 MessageBoxA를 호출하고 있다.

 

 

 

하지만 이미 jmp하기 전에 push로 스택에 인자가 넘어왔기 때문에 함수 호출에는 이상이 없다. 여기를 OEP로 지정한 후 새롭게 덤프를 뜨면 메시지함수 인자 구성이 안되기 때문에 실행에 문제가 생기는 것이다.

 

 

 

실제로 코드 복원 없이 언팩을 해준 후 실행을 하려 하면 아래와 같이 제대로 실행이 안된다.

 

 

 

그렇다면, 아까 보았던 3개의 push 부분이 StolenByte가 맞는 것으로 확인된다.

 

 

 

해당 코드를 복원해주자. 총 [6A 00 68 00 20 40 00 68 12 20 40 00] 으로 12바이트이다. 40100C부터 시작이었으므로 -C를 해준 401000 주소부터 덤프에서 코드를 복원해주었다. 

 

 

 

그리고 새로운 주소인 OEP를 사용해 언팩을 해주었다.

 

 

 

그러면 아래와 같이 언팩된 파일도 실행이 잘되는 것을 볼 수 있다.

 

'리버싱 > CodeEngn' 카테고리의 다른 글

[CodeEngn] Basic RCE L11 풀이  (0) 2020.02.25
[CodeEngn] Basic RCE L10 풀이 (ASPack)  (0) 2020.02.24
[CodeEngn] Basic RCE L08 풀이  (0) 2020.02.22
[CodeEngn] Basic RCE L12 풀이  (0) 2020.02.22
[CodeEngn] Basic RCE L07 풀이  (0) 2020.02.20

댓글

Designed by JB FACTORY