0114_example.exe

Kail-KM
|2015. 1. 16. 03:29

0x01 기본분석


<Exeinfo PE>

패킹이 되어있지않으며 별다른 이상은 없는것 같습니다.

<실행시>

앞부분에서 =====안녕하세요===라는 멘트가 나오며 그 후 두개의 숫자를 입력하라고 화면에 출력이 된다. 그후 입력함수를 통하여 입력을 받습니다.

입력을 받은 두 숫자를 한번 출력을 한후 사칙연산을 선택하라 합니다. 사칙연산을 선택하면 앞의 입력받았던 두 숫자의 연산 결과를 출력하여 나타내주며 프로그램은 종료됩니다.

시작 > 멘트 > 숫자 2개 입력 > 연산선택 > 결과 출력 > 종료


0x02 분석


<변수의 선언>

EBP를 기준으로 EBP-8, -14 -20 으로 3개의 4BYTE에 0으로 초기화하는 것을 알수가 있습니다.

따라서 int a=0,b=0,c=0;으로 변수를 선언하고 있습니다.


<기본 문자열 출력>

0x01 분석에서 보았던 것처럼 시작과 함께 출력될 멘트를 호출 하는 CALL 함수들이 존재하고 있으며 가장 밑에는 두개의 숫자입력을 요구하는 문자열 또한 출력을 하고 있습니다.

여기서 또한 고려해보아야 할점은 문자열을  출력하고 다음 문자열을 출력하기 전마다 항상 ADD ESP,4가 존재하고 있다는 것을 볼 수 있어야 합니다.(나중에 더 자세히 보기로..:)


<두개의 숫자를 입력>

CALL 0087382F를 호출하면 프로그램 화면에는 숫자의 입력을 기다리게 됩니다. 그 후 입력을 받고 난후에는 EAX에 저장된 b를 먼저 스택에 쌓고 그후에 ECX에 저장된 a의 값을 으로 보내는것을 확인할 수가 있는데 이는 스택의 특성상 printf함수를 통하여 먼저 스택에서 다시 나와야하는 것은 a이기에 a를 마지막에 넣는 것이며 b는 나중에 불리기에 미리 스택에 쌓아놓는 것입니다.


<사칙연산의 선택>

%d 형태의 숫자를 입력 받을려 하는 것을 확인할수가 있습니다. 입력을 받은후 그 값은 c의 주소값에 저장이 되어있으며, 붉은 부분을 보는 것과 같이 SUB ECX,1 로 인하여 1을 감소시키고 있는 것을 확인 할수 있습니다.


<비교문을 통하여 출력>

맨 윗줄에서 입력받은 값 c-1 /*SUB ECX,1*/의 값이 3보다 클 경우에는 바로 밑의 점프문을 통하여 종료문으로 보내는 구조를 가지고 있습니다. 그 후 만약 그 값이 3보다 크지 않은 경우에는 붉은 부분의 점프문을 이용하게 되는데  C언어의 IF문을 사용한 것이라 예상합니다.


곱셈의 경우 쉽게 파악을 할 수 있으며 나눗셈의 경우 INT형으로 선언을 하였기에 CVTPI2PS를 통하여 Double 자료형으로 만들어 주어야합니다. 그렇게 (double)a,(double)b를 DIVPS XMM0,XMM1을 통하여 나누어 주며 그 결과는 밑에 CALL명령어의 호출을 통하여 출력이 됩니다.



0x03 C언어로 복원




0x04 복원한 프로그램의 실행



'Study > CodePA' 카테고리의 다른 글

15.01.14-0x02 XORandShift.exe  (0) 2015.01.16
15.01.14-0x01  (0) 2015.01.14