티스토리 뷰

Reversing/* reversing.kr

reversing.kr - Replace

live2skull 2016. 7. 19. 23:29

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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함