티스토리 뷰





Reversing.kr의 문제 Replace입니다.


문제 파일을 실행시켜보겠습니다.






숫자만 입력받을 수 있습니다.


아무 숫자나 입력해보니 문제가 발생해서 프로그램 작동이 중지됩니다.


패킹은 되어있지 않으니 바로 올리디버거로 분석하겠습니다.






올리디버거로 실행시킨 후 아무 숫자나 넣고 체크 한 후 0040466F 주소를 보면 EAX에 0x90(NOP) 저장하는데 이 부분에서 문제가 발생합니다.






왜냐하면 현재 EAX에 저장돼있는 주소인 60160A20은 접근할 수 없는 주소이기 때문입니다.


접근을 할 수 없는 곳에 0x90이란 값을 넣으려고 하니 오류가 발생하는 것입니다.


이제 프로그램에서 숫자를 입력받고 처리하는 부분을 보겠습니다.






숫자를 입력받는 함수인 GetDlgItemInt에 BP를 걸어주고 실행시켜보겠습니다.






위 그림과 같이 0040105A에서 멈췄습니다.


위 과정을 설명하면,


0040105A : 숫자를 입력받고 16진수로 변환 후 EAX에 저장


00401060 : 0x4084D0에 EAX값 저장


00401065 : 0040466FF 함수 호출


이제 0040466FF에서 어떤 과정이 일어나는지 분석해보겠습니다.






0040466F 주소로 이동한 화면입니다.


0040466F 함수에서 0040467A 함수를 호출합니다.


0040467A 함수의 코드를 해석해보면,


0040467A : 0x61906EB의 값을 0x406016 주소에 넣는다.


00404684 : 0040489 함수 호출.


0040489 : 0x4084D0 주소의  1 증가.


004048F : 0040489로 돌아가서 다시 한번 더 0x4084D0 주소의  1 증가하고 00404674 주소로 RETN.






00404674 주소에서는 0x4084D 주소에 601605C7을 저장합니다. (사용자가 입력한 값 + 2 + 601605C7 이 주소가 사용자 값이 위치한 주소가 됨)


그리고 00404684 주소에서 아까 0x4084D 주소에 저장된 값(사용자가 입력한 값)에 2를 더한 00404689 주소를 다시 호출합니다.


이로인해서 다시 한번 더 0x4084D 주소에 저장된 값에 2를 더한 값이 0x4084D 주소에 저장됩니다.


그리고 0040106A 주소로 리턴합니다.






이곳에서는 EAX를 초기화시켜주고 00404690 주소로 점프합니다.






중요한 코드들만 해석해보면,


00404690 : 0x4084D 주소의 값을 EAX에 넣는다.


0040469A : 0x4084D 주소의 값을 2 더해주는 함수인 00404689를 또다시 호출.


0040469F : 0xC39000C6 값을 0x40466F 주소에 넣는다.


00404A9 : 0040466F 주소 호출






0040466F 주소는 접근할 수 없는 주소에 0x90(NOP)을 저장하려고 해서 문제가 발생했던 곳입니다.


처음에 디버깅 할 때는 문제가 없었는데 지금은 문제가 발생했습니다.


왜냐하면 0040469F 주소의 코드로 인해서 0040466F의 코드가 변경되었고, 0x4084D 주소의 값을 EAX에 넣는 과정에서 해당 코드를 주소로 삼아서 0x90(NOP)을 넣으려고 하니 오류가 발생하는 것입니다.


하지만 EAX에 접근이 가능한 정상적인 주소가 들어있다면? 그 주소에 NOP를 생성할 것입니다.


만약 EAX에 접근이 가능한 정상적인 주소가 들어있다면 문제없이 004046C4 주소에서 00401071로 점프할 것입니다.






점프한 00401071의 주소를 보면 00401084 주소로 점프시킵니다.


그런데 00401073 ~ 0040107E 부분의 코드를 보면 이곳이 성공 문자열을 출력시키는 곳임을 알 수 있습니다.


하지만 위에 있는 00401071 주소의 코드 때문의 성공 문자열을 출력시켜주는 곳을 지나가게 돼버립니다.


아까 위에서 0040466F 함수를 두 번 호출할 때 EAX의 연속적인 2바이트를 0x90(NOP)으로 바꿀 수 있었습니다.


따라서 00401071 ~ 00401072의 값이 NOP로 바뀌려면 0x4084D 주소의 값을 EAX에 넣을때 0x4084D 주소의 값이 00401071이 되어야 합니다.


아까 사용자가 입력한 숫자에서 총 4를 더하고 601605C7도 더했으니,


FFFF FFFF - 601605C7 - 4 + 00401071을 하면 우리가 원하는 값이 나올 것입니다.


위 식을 통해 얻은 값을 10진수로 바꾸고 프로그램에 입력한 후 체크해보면..








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

[Reversing.kr] Easy ELF 풀이  (1) 2017.12.20
[Reversing.kr] ImagePrc 풀이  (3) 2017.12.18
[Reversing.kr] Music Player 풀이  (2) 2017.12.10
[Reversing.kr] Easy Unpack 풀이  (3) 2017.12.03
[Reversing.kr] Easy Keygen 풀이  (3) 2017.11.30
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함