본문으로 바로가기

 

다운로드 :

task.zip

 

파일을 살펴보면 perl 모듈 파일(pm), perl 스크립트 파일(pl), key파일과 암호화된 bin파일을 확인할 수 있다.

pl파일을 확인해 보면 사용자 모듈을 사용하며 eval 함수로 무엇인가를 실행하는 것을 확인 가능하며 특별한 것은 없어 보인다.

pm파일은 여러개의 서브루틴으로 이루어져 있으며 전부 한줄로 붙어있기 때문에 보기 편하게 나눠서 살펴봤다.

처음 실행되는 서브루틴은 pon()이며 pon()은 실행하는 pl파일을 읽어와 서브루틴 yep()을 호출하고 bin파일 서브루틴 yep()의 리턴 값을 이용하여 split을 진행한다.

그 후에 key파일을 읽어온다.

참고 : pl파일을 읽어와서 binary 값으로 변환시키는데 원본 소스를 수정하게되면 binary값이 변경되어 코드 실행이 되질 않는다.

서브루틴 yep()은 unpack을 이용하여 읽어온 파일을 binary로 변환 후 난독화를 진행하는 함수이다. 하지만 문제를 푸는데 크게 관련이 없어서 넘어갔다.

 

서브루틴 pon()이 종료되면 서브루틴 g()를 실행하고 g()는 앞에서 추출한 data를 이용하여 eval함수의 값으로 전달하는 것을 확인할 수 있다.

eval()함수가 어떠한 명령어를 실행하는지 알아보기 위하여 서브루틴 g()를 수정후 실행하여 보았다.

 

pm파일

 

 

실행 결과

 

실행하면 Password를 입력 받고 길이를 확인하는 것을 알 수 있다.

Password 길이를 8글자 이상으로 입력하면 다음과 같이 비교구문을 확인할 수 있다.

 

 

Password를 확인한대로 입력하면 Answer를 입력하라 하고 입력하면 또 다시 비교하는 구문을 확인할 수 있다.

 

두개의 정확한 값을 넣으면 flag 값을 확인할 수 있다.

pm파일을 수정할 때 개행을 넣지 않아 찾기 불편하기 때문에 개행을 입력하고 출력하면 좀 더 쉽게 확인 가능