reversing

Layer7 리버싱 10차시 과제(VM) - prob1

leesu0605 2022. 8. 24. 10:34

일단 파일을 아이다로 열어 분석해보았다.

대충 사용자로부터 48바이트 문자열을 입력받은 후, v5배열에 내용을 복사하고, run_cpu 함수를 수행한 후에 v5의 15번째 문자가 0(NULL)문자가 아니면 Wrong..., 0이 아니면 Correct!를 출력하고 있다.

우리의 역할은 v5의 15번째 문자가 0이 되는 문자열을 찾아야하는 것이다.
따라서 run_cpu의 내용을 분석해보았다.

바로 전 문제와 크게 다른 게 없었다.
그냥 stub 배열의 값에 따라서 문자열을 변조하는 코드였는데, 이 모든 코드를 복사하고, 값을 변조하는 부분만 문자열로 출력해준다면, 제대로 된 값이 나올 것이다.

일단 코드를 짜기 전 stub의 내용을 [shift+E]로 복사해주었다.

그 후,

이런 식으로 C++ 코드로 복사해주고 run_cpu 내용을 그대로 갖다 쓰되 a1 연산 부분만 출력해주면
수행되는 모든 식이 문자열로 출력될 것이다.

이런 식으로 코드를 짰다.
진짜 말그대로 아이다 코드를 그대로 복사했다.

그 후 코드를 실행하면,

모든 연산 과정이 출력되는 걸 볼 수 있다.
그러나 이 과정이 순탄치는 않았다.
사실 아이다에서 QWORD 문자만 봤어도 20분컷이 가능했는데, 그걸 못 봐 2시간을 제대로 된 식을 찾는데 써버렸다.
결국 2시간을 날리고서야, unsigned long long형 포인터를 쓸 생각을 하게 됐다.

이제 익스플로잇 코드를 짜보자.

일단 이런 식으로 7개의 64비트형 비트벡터를 선언한다.
원래는 15개를 모두 선언해줘야하지만, 8부터 14까지는 쓰이지 않기 때문에 그냥 15번째를 6번째로 바꿔 썼다.

그 후, 아까 추출했던 식을 그대로 복사&붙여넣기 해준 후,

REG[6]==0이라는 식을 solver에 추가해주면, 출력이 제대로 될 것이다.

실행시켜봤다.

문자열을 보니 플래그가 제대로 나온 것 같고, 이를 플래그 순서대로 조합하면,

flag : L7{DO_U_HAVE_HEXRAYS_FOR_VIRTUAL_MACHINE?}