짱짱해커가 되고 싶은 나

[replace] write up 본문

reversing/reversing.kr

[replace] write up

동로시 2020. 11. 29. 20:45

문제 분석

무슨 값을 입력하고 check를 누르면 wrong이 뜬다.

readme 텍스트는 없지만 correct가 되는 어떤 값을 찾으면 될 것이다.

 

GetDlgItemInt 함수가 입력받는 부분이다.

숫자를 입력받은 다음에 4084d0에 eax값, 즉 입력받은 값을 저장한다.

그리고 0x0040466f를 호출하고 404690으로 jmp, 401084로 jmp를 한다.

여기서 401084로 jmp하면 correct를 얻을 수 없으니까 이 부분을 해결하면 될 것 같다.

 

0x40466f를 보면 eax에 90(nop)을 넣고 retn 종료한다. 아닌가?

ecx + 4084d005에 al을 더한다. 그리고 bh += al, eax += 601605c7, 4084d0++, 4084d0 ++을 한다. ?ㅜ

잘 모르겠으니 디버깅을 돌려보자.

디버깅으로 돌려보니 같은 40466f인데 들어가 있는게 다르다.

처음에 49467a를 호출하고 404684에서 4084d0의 값을 ++시킨다. 여기에는 eax(우리가 입력했던 값)가 들어있다.

그리고 다시 돌아와서 404689에서 다시 1을 증가시키고 404674로 복귀한다.

4084d0에 +0x601605c7을 한 뒤 eax의 값을 1증가지시키고(!4084d0) 다시 4084d0의 값을 +2시킨다.

즉, 4084d0에 우리가 입력한 값 + 4 + 0x601605c7을 시키는 것이다. (eax는 +1)

 

그다음에는 0x404690으로 jmp한다.

 

0x404690을 보면 eax에 4084d0의 주소를 넣고 404689를 호출한다. 여기서 보면 40494d0의 값을 +1시킨다.

그리고 40466f에 c39000c6을 넣는다!

이게 뭐냐면 명령어를 바꾼 것이다. 아까 처음에 봤을때 nop넣는 명령어로 40466f함수를 바꾼 것이다.

이렇게 바꾼다음에 40466f를 호출하여 eax에 저장된 곳을 nop으로 만들고 멈춘다.

이 때 eax에는 4084d0이 들어가 있다.

 

만약에 이부분을 에러 없이 통과했다면 eax에 +1을 하고 40466f를 다시 호출한 뒤 40466f의 명령어를 6e8로 바꾼다.

6e8은 call 40467a가 된다. (원래 코드)

그리고 eax-1을 한 뒤 0x401071로 jmp한다. 여기서는 401084로 jmp해서 correct를 출력하지 못한다.

 

 

Exploit

우리는 0x401071을 수행하면 안된다.  그리고 0x40466f함수를 eax를 nop으로 만들고 c3 retn도 실행하면 안된다. 

0x401071의 주소를 nop으로 만들면 되지 않을까?

eax에 0x401071을 넣으면 이 주소의 명령어들에 nop이 들어갈 것 이다.

 

그리고 eax에는 4084d0의 값 = 원래 우리가 입력하는 값 + 4 + 0x601605c7된 값이 들어간다.

따라서 a02a 0aa6을 10진수로 넣어주면 될 것이다.

2687109798 

'reversing > reversing.kr' 카테고리의 다른 글

[Music Player] write up  (0) 2020.11.22
[Easy UnpackMe] write up  (0) 2020.11.14
[Easy Keygen] writeup  (0) 2020.11.08
Comments