티스토리 뷰
1.
프로그램 실행 시 문자열을 입력할 수 있는 창이 뜸.
아무거나 입력하고 "Check" 를 누르면, 프로그램이 터진다.
디버깅해서 오류가 난 Insturction 의 주소를 확인한다.
2.
0040466F 에서 오류가 발생하였다. (eax 주소에 접근할 수 없음.)
해당 주소의 근처에 jnz 와 같은 분기문으로 접근하는 코드가 없으니,
jmp far ptr 을 이용한 점프문이나 call 로 실행되었을 것으로 볼 수 있다.
본 구문은 call 으로 실행되었음 알 수 있으며, 현재 스택 포인터에서 call ret address 를 찾을 수 있다.
코드를 실행한 주소는 004046A9
3.
해당 코드 근처에 bp 를 걸고 다시 실행한다. 조금 위로 올라가보면,
eax 에 다이얼로그 텍스트 박스에 있는 문자열을 받아 unsigned Int 로 파싱해서 저장한 다음,
! 전역변수 공간에 위치하는 004084D0 주소에 저장한다. (dword)
-> GetDlgItemInt msdn : 어셈에서 bSigned 인자값이 false로 설정되어 있다. (데이터를 unsigned int로 가져온다.)
4.
00401065 에서 0040466F 주소 함수로 호출.
바로 다시 0040467A 주소 함수로 호출.
! 00406016 주소에 619060EBh 저장.
00404689 주소 함수로 호출.
! 004084D0 주소값 데이터 1 증가.
ret address 로 이동. _ 00404689
! 004084D0 주소값 데이터 1 증가.
ret address 로 이동. _ 00404674
! 004084D0 주소값 데이터 601605C7h 증가.
00404689 주소 함수로 호출.
! 004084D0 주소값 데이터 1 증가.
! 004084D0 주소값 데이터 1 증가.
-> 최상위 함수(Dialog Callback Procedure) 로 복귀 _ 0040106A
그냥 일일히 확인할 필요 없이, 맨 마지막에 계산된 값을 확인해도 된다.
5.
00404689 호출함.
! 004084D0 주소값 데이터 1 증가.
6.
0040469F 주소에서, 0040466F 주소에 특정한 값을 넣음.
분석해보면, 해당 주소에 있던 기존 명령어들을 지우고, 새로운 명령 Opcode 를 복사하는 것을 볼 수 있으며,
복사된 opcode 는
mov byte ptr [eax], 90h
retn
으로 디스어셈블 된다.
1번에서 프로그램이 오류가 난 이유는 eax 레지스터에 저장된 데이터를 주소로 참조하여, 90h 데이터를 쓰는 중 해당 주소에 접근하지 못했기 때문이다.
eax를 1 늘리면서, 총 2바이트의 메모리를 90h 로 변경하는 작업을 한다.
7.
00401073 주소에 "Correct!" 메세지 박스를 표시하는 코드가 있으나, 위에 jmp 문으로 인해 접근할 수 없다.
이 코드에 접근하려면, 바로 위 2 바이트로 되어 있는 jmp Instruction 을 다른 코드로 바꾸어야 한다.
6번에 볼 수 있듯이, 특정 메모리 address 를 90h (nop Instruction)으로 바꾸어 주는 코드가 실행될 때,
eax가 00401071 가 되도록 입력값을 조정하면 된다.
int(INPUT_STR) + 0x601605c7 + 4 = 90h
int(INPUT_STR) + 0x601605c7 + 5 = 90h
> INPUT_STR + 0x601605c7 + 0x4 = 0x00401071
8.
코딩
// jochiwon.tistory.com // reversing.kr Replace int main(int argc, char* argv) { unsigned int based_add = 0x601605c7 + 0x4; // 넣어준 데이터에 더해지는 값 unsigned int destination = 0x00401071; // 목표값 unsigned int answer = 0; answer = destination - based_add; printf("Answer : %u\n", answer); // %u 포맷 스트링 - unsigned int }
답 : 2687109798
'Reversing > * reversing.kr' 카테고리의 다른 글
reversing.kr - ImagePrc (0) | 2016.07.22 |
---|---|
reversing.kr - Music Player (0) | 2016.07.21 |
reversing.kr - Easy Keygen (0) | 2016.07.20 |
reversing.kr - Easy Unpack (0) | 2016.07.18 |
reversing.kr - Easy Crack (0) | 2016.07.17 |