728x90

*아래 내용은 동아리 활동으로서 정리한 것이므로 코드 역시 제공받아 사용하였습니다.*

*배운 것을 바탕으로 정리한 것이므로 오류가 있을 수도 있습니다.*

*사진이 파일에 있는데 복사가 안되어 단순히 글로만 설명합니다.*

 

후킹?

다른 프로세스에 걸려 해당 프로세스의 정보를 얻어오거나 변경하는 기술. 한마디로 도청이라고 할 수 있다

 

키보드 후킹?

키보드로 치는 것을 가져오거나 변경하는 악성 코드 ==> 개인 정보 탈취 가능

이를 위한 프로그램

ollydbg, PEview, IDA free, Process Explorer, visual Studio c++

 

-키보드 후킹 정식 실습-

visual studio c++을 이용한 실습

HookMainkeyhook에 대한 코드를 먼저 받아서 솔루션에 각각 만들어준다.

HookMainc++ 프로젝트로 생성, keyhook의 경우에는 dll로 반드시 만들어주어야한다.

--------------------------------

생성을 한 후 메모장을 연다.

파일을 실행 시키지 않은 채로 메모장의 상태는 정상적으로 입력이 된다.

 

만약 파일을 실행시키고 메모장을 써보게 되면 더이상 메모장에 입력이 되지 않는 다는 것을 활용할 수 있다.

 

왜 실행이 안될까?

HookMain이 실행되어 keyhook가 연동이 되었고 결과적으로 메모장을 실행 시켰을 때 입력을 막는다

 

이제 Hookmain.exe를 이용해서 실행을 해보자

이건 visual studio가 안됐을 경우때문에 제공받은 것인데 똑같은지 확인하기 위해서 진행하였다.

 


역시나 visual studio와 같은 결과를 도출하는 것을 확인할 수 있다.

 

이제 본격적인 분석 과정을 진행해보자

다양한 방식으로 확인을 진행하였는데 첫번째로 진행한 것은 Process Explorer을 이용하였다.

 

1. Process Explorer을 이용한 확인

Hookmain.exe 파일을 실행하고 process Explorer을 열어보았다. 잘 찾아보면 Hookmain.exe 파일이 실행되고 있다는 것을 확인 가능하다.

그리고 여기에 연결되어있는 keyhook를 확인 해보면 된다. 클릭을 해서 이제 창을 아래에 볼 수 있는데 여기서 keyhook.dll이 있는 것을 확인할 수 있다. 이 방식을 통해 keyhook와 hookmain이 연결되어 있는 것을 확인하는 것이다.

 

두번째로는 ollydbg를 이용해서 확인할 수 있다.

 

2. ollydbg를 이용한 확인

ollydbg에서 한번 확인해보자

파일 열기를 통해 Hookmain.exe을 열어준 후에 option-debugging options- events를 누르게 되면 ‘break on new module’이라는 글자를 발견할 수 있다. 이것을 체크하고 확인을 눌러준다. 이후 F9키를 연달아 누르면서 keyhook를 확인하다보면 dll이 어디있는지 확인이 가능하다. 내기준으로는 10001587에 있는 것처럼 보였다.

 

세번째로는 IDA free를 이용하였다. 이 프로그램은 어떻게 연결 구성이 되어있는지 보기 쉽게 되어있다고 하였다.

 

3. IDA free를 이용한 확인

IDA free를 이용해서 확인해보고자 한다.

이렇게 파일을 열면 뜨게 되는데 dll파일형태인 keyhook를 찾아보자

너무 많은 정보들이 있으므로 한눈에 찾기 어렵다. 그래서 text search 기능을 이용하였다. search에 dll를 입력해서 검색을 해보면 결과적으로 두개의 주소가 있는 것으로 보인다. 그래서 여기서 하나를 클릭해보면 dll이 있는 구성을 발견하게 되고 여러가지를 볼 수 있다.

 

여기서 keyhook.dll파일이 구성되어 있다는 것을 확인할 수 있다.

 


여기까지가 동아리 악성코드 실습의 첫번째를 완성하였다. 키후킹이기도 하고 처음 하는 것이기 때문에 여러프로그램을 통해 볼 수 있다는 사실과 한개의 결과를 여러번 확인할 수 있었다. 컴퓨터에서 exe를 할때 키후킹 걸릴때마다 계속 응답없음이 떠서 종료와 실행을 반복하긴 했지만 그래도 결과적으로는 한번씩 해볼 수 있었다.  조금 어렵긴 하다. 전공생이 아니라 구체적으로 배우지 않았기 때문이다. 그래도 첫번째 것은 어려운 것은 아니여서 할만했던 것 같다. 앞으로도 이렇게 꾸준히 해야겠다. 필요한 것은 검색하면서!!!!

 


이 내용들에 대해서 부족한 사진과 관련해서는 메일로 별도로 알리는게 좋을 것 같다. 코드내용들도 있고 내 개인정보도 있기 때문이다. abby0616@naver.com 으로 메일을 주면 간단하게라도 답해줄 수 있을 것이라고 생각한다. 자세하게는 잘 모르지만.....

 

다음 악성코드 포스팅은 2주차로 진행했던 스파이웨어-keylogger을 포스팅하도록 하겠다.

 

 

728x90
728x90
문제설명

다음과 같은 n*n 배열 구조를 출력해보자.

입력이 3인 경우 다음과 같이 출력한다.
3 2 1
6 5 4
9 8 7

입력이 5인 경우는 다음과 같이 출력한다.
5 4 3 2 1
10 9 8 7 6
15 14 13 12 11
20 19 18 17 16
25 24 23 22 21

입력이 n인 경우의 2차원 배열을 출력해보자.

 

 

입력

첫 번째 줄에 배열의 크기 n이 입력된다.
[입력값의 정의역]
1<= n <= 100

 

 

출력

n*n 크기의 배열을 설명과 같이 채워 출력한다.

 

 

입력 예시

4

 

 

출력 예시

4 3 2 1

8 7 6 5

12 11 10 9

16 15 14 13


#include <stdio.h>
int main(void){
    int n,m;
    int nsize[101][101];
    scanf("%d", &n);
    for(int i=0;i<n;i++){
        for(int j=n-1;j>=0;j--){
            nsize[i][j]=m+1;
            m++;
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            printf("%d ", nsize[i][j]);
        }
        printf("\n");
    }
    return 0;
}

이 문제가 살짝 어렵게 느껴졌다. 앞에 문제와 다른 점이 있었는데 그것은 줄마다 서로 순서가 바뀐다는 것이다. 이것을 어떻게 코드로 해결할 것인가가 중요한 문제인것 같다. 이를 해결하기 위해 각 줄을 나타내는 i는 그대로 가고 각각의 숫자를 나타내는 j를 반대로 작업을 해주면 된다. 그리고 nsize라는 숫자 배열을 설정해주었다.그리고 m+1을 해 주었는데 그 이유는 나는 0을 시작점으로 잡아서 숫자가 하나 작기 때문이다.이렇게 for 문을 설정해주면된다.

이후 출력도 크게 달라지는 것은 없고 nsize배열을 출력시키면 된다. 4개 이후 줄바꿈을 위해 for문의 j가 끝나면 \n을 통해 줄을 바꿔주는 코드를 써주면 된다. 이것을 통해 만들어 낼 수 있다.

728x90
728x90
문제설명

 XX사에서 만든 디지털 도어락은 내부적으로 보안키 값을 가지고 있고, 이 값은 1,000이하의 자연수로 이루어져 있다. 각 카드키들은 ID값을 가지고 있는데, 이 값이 도어락의 내부 보안키 값의 약수이면 이 도어락을 열 수 있다.

길동이는 △△사에서 근무하고, △△사는 XX사에서 만든 디지털 도어락을 쓴다. 길동이가 자신의 사무실로 가기 위해서는 3개의 문을 통과해야 한다. 길동이는 자신이 통과해야하는 3개의 문의 내부 보안키 값을 알고 있을 때, 이 3개의 문을 모두 열 수 있는 만능 보안키를 여러분에게 의뢰했다. 길동이를 도와주자.

단, 보안키의 ID값이 클수록 제작비용이 적다. 최소한의 비용을 마스터 보안키를 만드는 프로그램을 작성하시오.

 

 

입력

세 자연수가 공백으로 구분되어 입력된다.

각 값들은 도어락의 내부 보안키의 값을 의미한다.

각 값은 1,000이하의 자연수이다.

 

 

출력

가장 가격이 저렴한 만능 보안키의 ID값을 출력한다.

 

 

입력 예시

10 20 30

 

 

출력 예시

10


#include <stdio.h>
#include <stdlib.h>
int gcd(int a,int b){
    while(b!=0){
        int temp=a%b;
        a=b;
        b=temp;
    }
    return abs(a);
}
int main(void){
    int a,b,c,temp;
    scanf("%d %d %d", &a, &b,&c);
    temp=gcd(a,b);
    printf("%d", gcd(c,temp));

    return 0;
}

이 문제에 대한 문제풀이도 딱히 없어서 조금 어려웠다. 한사람의 풀이를 보고 풀게 되었다.

처음에는 함수로 풀어야 되겠다는 생각이 들지 않았다. 처음에 생각한 것은 배열형태로 비교할까 싶었다.

그리고 생각한 것, 메인 함수 안에서만 해결해야 겠다는 생각이 들었다. 그런데 이것을 분석하다 보니 효율적인 코드가 아니였다. 위의 형태가 가장 이상적이었다. 그리고 위에서 gcd를 단순한 함수라고 생각했는데 아니였다.

 

gcd는 최대공약수, abs는 절댓값

이것을 이용한 것이였다. 그래서 a와 b의 값을 이용해 나머지를 구했고 나온 값을 다시 c의 값과 비교해서 도출해낸 것이였다. 잠시 잊고 있었던 특정 용어들, 최대 공약수, abs 절댓값을 잊어버리면 안되겠다는 생각이 든다. 이것을 이용해 최대 공약수를 구한다. 그래서 나머지 구하는 것이다. 이후 절댓값으로 반환해 temp로 지정해준다. temp가 과정에서 2번 나오는데 지역변수로 다루었기 때문에 큰 문제가 없다.

728x90

+ Recent posts