-->

[CodeEngn] Basic RCE L14 풀이

CodeEngn Basic RCE L14 문제 확인

Name이 CodeEngn일 때의 시리얼 값을 구하는 문제인 것을 보니 Name에 따라서 시리얼 값이 달라지는 모양이다.

 

 

 

파일을 실행시켜보니 아래와 같이 두개의 입력값을 받게 되어있고 첫번째 입력값이 Name인 것으로 추정된다.

 

 

 

참고로 해당 파일은 UPX 패킹이 되어있기 때문에 언팩을 해주어야 한다. CodeEngn 문제 파일 중에 UPX로 패킹되어있던 파일이 많아 여러번 언팩을 했으므로 언팩과 관련해서는 아래의 포스팅 등을 참고하길 바란다.

 


관련포스팅

[CodeEngn] Basic RCE L05 풀이 (UPX 패킹)

[CodeEngn] Basic RCE L06 풀이

 

 

 

CodeEngn Basic RCE L14 풀이

임포트하는 함수중에 GetDigItemTextA는 텍스트 값을 입력받는 함수이므로 해당 함수를 호출하는 곳을 찾아보았다.

 

 

 

해당 함수에는 아래와 같이 GetDigItemTextA로 총 두번의 입력 string을 받고 있으니 첫번째는 name 부분이고 두번째는 시리얼을 입력받는 부분일 것이다. 그리고 입력받은 string은 각각 403038과 403138에 저장된다.

 

 

 

순서대로일것 같긴 하지만 어떤 것이 첫번째 입력값이고 두번째 입력값인지 확인해보기 위해 입력값을 받는 부분에 bp를 걸고 실행시켜보았다. 문제에서 Name은 CodeEngn일때라고 가정하고 있으므로 첫번째 입력칸에는 CodeEngn을 넘겨주었다.

 

 

 

예상한대로 첫번째 입력값은 403038에 두번째 입력값은 403138에 저장되었다.

 

 

 

그럼 이제 어떤 방식으로 Name을 사용해 시리얼이 생성되는지 확인해보자. 헥스레이로 확인해보면 Name 문자열 길이(v6)만큼 반복문을 수행하는데 (403037[v7] >> 1)의 shift 연산에 (403037[v7] * 403037[v7]) + (v5) - (403037[v7]) 와 같은 연산을 하고 있다. 그리고 이 값이 입력해준 시리얼 값과 같으면 성공 메시지 박스가 나오게 된다.

 

 

 

그럼 일단, Name(CodeEngn)은 403038에 저장되는데 403037이 사용되고 있으므로 따로 저장된 것이 있는지 확인해보자. \x00이 들어가있다.

 

 

 

이 문제는 아무래도 반복적으로 연산을 수행해야하는 만큼, 간단히 코드를 짜서 돌리는게 목적인 문제인 것 같다. 따라서 위에서 확인해준 연산대로 간단히 파이썬 코드를 짜주었다.

 

 

 

위 코드의 결과로 출력된 v5 값을 넣어주면 성공 메시지 박스를 볼 수 있다. 지금에서야 확인했는데 정답을 공개하면 안된다고 해서 직접적인 정답 값은 쓰지 않기로 했다.

 

 

댓글

Designed by JB FACTORY