Kali-KM_Security Study

0114_example.exe

Study/CodePA2015. 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' 카테고리의 다른 글

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

Comment +0

0x01 파일을 실행했을 때의 결과



0x02 OllyDbg를 통한 접근


a = ff00 으로 1111 1111 1111 1111 0000 0000 0000 0000
b = 00ff 이니 0000 0000 0000 0000 1111 1111 1111 1111 입니다.
이를 XOR  >> 1111 1111 1111 1111 1111 1111 1111 1111 

이를 Shift Left 16 으로 인하여 1111 1111 1111 1111 0000 0000 0000 0000 이 됩니다.


0x03 복원





XORandShift.exe


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

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

Comment +0

15.01.14-0x01

Study/CodePA2015. 1. 14. 02:25
#C프로그래밍 어셈블리로부터 복구


1. IDIV는 나눗셈을 하는 명령어인데 왜 인자가 하나 뿐인가?
2.CVTPI2PS 는 무엇인가 대체
3.스택에는 어떻게 쌓일까   라는 의문들을 가지게 되었습니다.



1.IDIB는 EAX와 연산을 한다고 Hex님이 이야기를 해주시니 앞뒤가 딱 맞는것 같습니다.
EAX와 연산을 한 후 EAX로 반환한다.

2.여기서 개인적으로 중요하다싶은게 CVTPI2PS 입니다. 
Convert two 32-bit signed integers from MM/Mem to two SP/FP.  라고 구글링 결과 알게 되었는데
생각을 해보니 정수를 저장할때는 그 공간에 그대로 채워 넣으면 되지만 실수를 저장할때는 그 공간을 나누어
소수점윗부분과 아래부분으로 나누어 저장한다는 것이 기억 났습니다.

아래의 두사진을 보면 한곳에는 소수점 윗부분이, 다른 한곳에는 소수점아래부분이 저장된것을 확인가능.






그후 MOVUPS라는 명령에 대하여 알아보았는데

"MOVUPS xmm1, xmm2/m128 는 Move packed single-precision floating-point values from xmm2/m128 to xmm1." 라는 말을 보아 뒤의 인자로부터 앞의 인자로 이동시킨다.
그렇다면 CVTPI2PS로 부터 나누어졋던 두 부분을 다시 합치는 것이라 예상을 하였습니다.





3.아직 스택에 대하여는 잘 모르지만 e가 먼저 스택에 쌓인 이유는 printf 함수에서 %c를 통해 e를 출력하는것이 다른 것보다 후에 일어나기에 e를 가장먼저 스택에 쌓고 그후는 %d에 해당하는 d를 스택에 넣는다. 그리고 가장 먼저 출력될 %lf에 해당하는 c를 나중에 스택에 넣는다고 생각된다.





따라서 >

warming_up.exe


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

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

Comment +0