이상연구원의 문제점 (2)

1. 나를 부수다

ELF 파일이기 때문에 Windows에서 열 수 없습니다.

리눅스에서 열 수 있는 파일인데 리눅스 한번 먹고 재설치 안하고…

먼저 x64dbg로 열 수 없어서 IDA로 엽니다.


먼저 함수 목록에서 main 함수를 찾아서 옮겼습니다.


main 함수에는 세 개의 매개변수가 있으며 C의 경우 argc와 argv 두 개가 있습니다.

차이점은 무엇입니까 … 나는 이것을 찾고있었습니다.

ㄴ근데 잘 모르겠습니다 이상회장님 확인하시면 답변 부탁드립니다.

그리고 또 다른 질문

strncpy(대상, a2(1), v5); 무슨 뜻인지도 궁금합니다.

답변을 듣는대로 다시 작성하겠습니다.

전달되면 memcmp를 통해 비교하는 sub_1189 함수가 있습니다.

값을 가져오고 sub_1189에서 특정 계산을 수행한 다음 &unk_4040의 값과 비교하는 것이라고 생각했습니다.

그럼 먼저 기능을 살펴보겠습니다.


예전에 많이 봤던 형식입니다.

i번째 문자와 XORing(i XOR 0x41)하는 방식입니다.

XOR의 경우 역연산이 쉬우므로 메모리에 무엇이 저장되어 있는지 확인해보자.


비교할 문자열은 다음과 같습니다.

그렇다면 XOR i^0x41 과 역연산으로 위의 문자열을 사용하면 플래그가 출력됩니다.


그래서 작성된 코드는 위와 같습니다.

실행할 때


플래그가 나타납니다.

2. function_secret


문제를 분석하고… 다시 생각해보자.

방금 디버거로 열었습니다.

하지만 그 전에 중요한 얘기가 있으니 짚고 넘어갈게.

정수 함수(){

}

에서 반환 값을 지정하지 않으면 어떻게 됩니까?

이것이 이 문제의 시작입니다.

그래서 간단한 코드를 따로 작성했습니다.


이 코드에는 func의 반환 값이 없으며 num으로 수신되어 출력됩니다.

이때 초기값은 3입니다.

이것은 printf의 반환 값입니다. func에서 printf 후 rax의 값을 건드리지 않기 때문에 위와 같은 결과가 나온다.

그렇게 설명하는 것은 말이 되지 않으니 디버거로 한번 살펴보자.


이건 언제 봐도 모르겠다.


return 0을 작성한 후; func에서 우리는 다시 시도합니다.


부르다 ~에

아래에 mov eax,0이 생성된 것을 볼 수 있습니다.

반환 값을 포함하는 rax가 이제 터치된 것을 볼 수 있습니다.

이제 문제를 해결해 보겠습니다.


이것이 아마도 주요 기능일 것입니다.

문자열을 출력하고 함수 401530을 입력합니다.


scanf로 입력만 받고 다시 출력하는 것 같습니다.

기본 보기로 돌아가서 38(16)자가 올바른지 확인하고 그렇지 않으면 “다시 생각하자”를 입력합니다.

38(16)개의 글자가 맞으면 다음 단계로 넘어갑니다.

여기서 중요한 것은 01625 라인의 반환 값인 eax와 0이 같아야 한다는 것입니다. 다르면 jne로 가서 “틀렸어”로 간다.

그런 다음 40156A에서 나오는 rax(반환 값)는 0을 포함해야 합니다.

안에 들어 가자.


이것은 지금까지 풀었던 문제와 유사하지만 23(16)번 반복하고 비교합니다.

하지만 이제 XOR을 사용하면…

그러나 이제 rax+14 이후 비교는 21번째 문자에서 시작됩니다. 이는 > 앞에 20자를 채우고 문자 수(38)로 표시해야 함을 의미합니다.

그 후에 ds:(403040) 와 memcmp 로 비교할 수 있지만 eax 에 0 을 넣고 돌려줘야 합니다…?

그래서 언제 eax를 만지나요?

memcmp에 감동했습니다. 값이 같으면 0을 반환합니다.

한 번 본 기억이 나지만 자세히 보지는 않았습니다. 좋아요.

memcmp 결과 rax가 0을 담고 더 이상 rax를 건드리지 않고 돌아오면 eax와 0을 비교했을 때 jmp가 같지 않고 “이것이 정답입니다!”가 출력된다.


플래그를 찾는 코드는 언제나처럼 이렇게 작성됩니다.


플래그는 이쪽


답변 검토를 마쳤습니다.