반응형

PE(Portable Executable) File 이란?

PE파일은 Windows 운영체제에서 사용되는 실행파일들을 말한다. 리버싱은 어떤 프로그램의 구조와 실행원리 등을 분석하는 것이므로 PE파일 구조를 상세히 알아보는 것이 중요하다.




PE File 종류




PE File의 대략적 구조



PE 파일의 구조에서 Dos header에서 Section header까지를 PE헤더라 하고, 나머지 부분을 PE바디라고 한다. 파일의 내용은 코드(.text), 데이터(.data), 리소스(.rsrc)로 나뉘어져 섹션에 저장된다.  섹션 헤더에는 각 섹션에 대한 크기, 위치, 속성 등이 정의되어 있고, PE헤더의 끝과 섹션의 끝부분에는 NULL padding 영역이 존재한다. 컴퓨터에서 패킷을 처리할 때 효율을 높이기 위해 최소 기본 단위 개념이 사용된 것이다. 파일/메모리에서 섹션의 시작은 최소 기본 단위의 배수에 해당되는 위치고 나머지는 NULL로 채워진다.




VA?? RVA??

PE파일과 메모리는 구조는 같으나, 파일은 offset, 메모리는 VA로 위치를 표시한다. (위의 그림에서는 offset이다.) 

VA프로세스의 가상 메모리의 절대주를 뜻하고, RVA어느 기준위치에서부터 상대위치를 뜻한다. 관계식은 아래와 같다.



PE 헤더 내의 정보는 RVA 형태로 되어있는게 많은데, 그 이유는 PE파일이 프로세스 가상 메모리의 특정 위치에 로딩될 때, 다른 PE파일이 이미 로딩되어 있을 수 있기 때문이다. 그럴 경우 다른 위치로 로딩을 다시 해주어야 하는데(재배치) VA로 되어있으면, 정상적인 엑세스가 이루어지지 않을 수도 있기 때문이다. RVA는 재배치가 발생해도 기준위치에 대한 상대위치가 바뀌지 않기 때문에 원할한 로딩이 이루어진다.



반응형

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

"pwnable.kr" fd 문제풀이  (0) 2014.11.04
PE헤더-NT Header  (0) 2014.08.03
PE헤더-Dos header/Dos stub  (0) 2014.08.03
리버싱 분석방법-정적분석, 동적분석  (0) 2014.07.07
반응형

Q. 두 개의 텍스트 파일이 같은지 다른지 확인해보자. 단순히 공백문자 하나가 차이를 보여도 두 텍스트 파일은 다른것이다.








비교할 문자들을 넣을 배열을 두개 선언하고,

두개의 파일을 읽기전용으로 오픈한다.










두개의 파일의 끝까지 반복문을 돌려놓고,

각각의 배열에 파일들의 문자를 저장한다.


두개의 배열을 서로 비교하여, 일치, 불일치를 판명하여 출력한다.




오픈한 파일을 닫는다.





*파일 경로를 직접 입력 받을 수도 있다. 입력 받을 배열을 선언해주고 scanf함수를 사용하여 입력 받아주면 된다.


-결과창-





*만약 공백이 다르거나 대문자와 소문자가 달라도 일치하지 않는다가 출력된다.


반응형
반응형

Q. 문자열을 저장하고 있는 파일을 열어서 A와 P로 시작하는 단어의 수를 세어서 출력하는 프로그램을 작성하라. 단, 모든 단어는 공백문자(스페이스바, \t, \n)에 의해 구분된다.










>>파일입출력

text.txt파일을 읽기용도로 오픈한다. 만약 없으면 파일오픈 실패 출력.




>>그 파일의 끝부분까지 반복문을 돌력 A,a 또는 P, p로 시작하는 단어의 수를 저장한다.

fscanf함수는 공백을 기준으로 문자열을 구분하기 때문에 사용했다.





>>저장한 수를 출력한다.


>>오픈한 파일을 닫아준다.



*파일의 경로는 프로젝트 파일이 있는 곳에 저장을 해주어 파일이름만 쓰는경우, 전체적인 파일의 경로까지 다 표시해주는 경우 둘다 가능하다.







text.txt의 전문이다.

스페이스와 엔터 둘다 구분이 가능한지 알아보기 위하여 둘 다 사용을 해보았다.










































-결과창-


반응형
반응형

Q. 복소수를 나타내는 구조체를 정의하고, 복소수의 덧셈과 곱셈을 위한 함수를 각각 정의하자. 이를 기반으로 프로그램 사용자로부터 두 개의 복소수 정보를 입력받아 덧셈과 곱셈을 해보자..


>>개요

복소수 덧셈 : (a+bi) + (c+di) = (a+c) + (b+d)i

복소수 곱셈 : (a+bi) x (c+di) = ac - bd + bci + adi



우선, 복소수의 실수부와 허수부를 한번에 쓸 수 있도록 구조체를 선언한다.

기존의 자료형이름 대신 새이름을 부여하기 위해 typedef를 선언했다.




구조체 변수를 대상으로 연산을 하려면 함수를 따로 정의해야 한다. 

Number 구조체 변수의 덧셈/곱셈 연산을 정의한다. (위-덧셈, 아래-곱셈)


메인함수에서 구조체 변수 Number를 선언하고 각각의 연산을 위해 함수를 호출한다. 


-결과창-



반응형
반응형

Q. 앞의 1번 문제에서 구현한 프로그램을 조금 변경하여 구조체 포인터 배열을 선언하고 구조체 변수를 동적으로 할당하는 형태로 프로그램을 재구현하라.



>>동적할당 함수 malloc을 쓰기 위하여 헤더파일 추가


>>book 구조체를 선언해준다.

   








-메인함수부-







































구조체 포인터를 선언한 후, p변수에 포인터 초기화 동시에 메모리공간을 동적으로 할당하여 준다. 그 후, 앞의 문제와 같이 반복문을 사용하여 입력과 출력을 해주고 마지막으로 동적할당된 메모리공간을 반환하여 준다.


-결과창-



반응형
반응형

LAN - Local Area Network : 어느 한정된 공간에서 네트워크를 구성하는 것(사무실)

WAN - Wide Area Network : 멀리 떨어진 지역간 네트워크 구축(인터넷)


네트워킹 방식은 크게 네가지로 나뉜다. 그러나 대부분 이더넷 방식이다.


-이더넷- 

  -CSMA/CD 프로토콜 사용

  -CSMA/CD = Carrier Sense Multiple Access/Collision Detection : 대충 눈으로 통신


이더넷 환경에서는 통신하고 싶은 PC나 서버는 자신의 네트워크 자원을 쓰고 있는 PC나 서버 중에서 통신 가능한 장비가 있는지 확인한다. (=즉 캐리어가 있는지 확인=>Carrier Sense)

캐리어가 감지되면 보낼 정보가 있어도 못 보내고 기다리고, 네트워크 통신이 없어지면 눈치를 보다 자신의 데이터를 네트워크 상에 실어보낸다. 눈치를 보다 두개 이상의 장비가 동시에 네트워크 상에 데이터를 실어보내는 경우(다중 접근) 충돌이 발생한다. = 콜리젼 발생

콜리젼이 발생하면 데이터를 전송했던 PC들은 랜덤한 시간동안 기다린 후 다시 전송해야 한다. 기다렸다 다시 보내도 충돌한다면, 또 다시 기다려야 한다. 그러나 15번을 전송했음에도 충돌이 발생한다면, 통신을 포기한다.

이더넷 환경에서 콜리젼이 발생하는 것은 CSMA/CD프로토콜 특성상 자연스럽지만, 너무 많은 콜리젼이 발생한다면 통신이 불가능해진다.


-토큰링-


토큰링 방식에서는 데이터를 전송하고자 하는 PC는 이더넷처럼 통신하고 있지 않다고 막 보내는것이 아니라 토큰을 가지고 있는 오직 한 PC만 데이터를 보낼 수 있다. 데이터를 다 보냈거나 보낼 데이터가 없으면 옆 PC에게 토큰을 전달한다.

콜리젼이 발생하지 않고 네트워크에 대한 성능을 미리 예측할 수 있지만, 순서를 기다려야 한다는 단점이 있다.


이더넷은 순서 없이 눈치로 통신 / 토큰링은 토큰을 가진 순서에 따라 통신

이더넷방식은 우리나라에서, 토큰링은 유럽에서 쓰인다고 한다.



반응형

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

TCP/IP 프로토콜  (0) 2014.08.02
캐스트 종류+OSI 7계층  (0) 2014.08.02
맥 어드레스(MAC Address)  (0) 2014.08.02
케이블에 대해...  (0) 2014.08.01
네트워크 개요  (1) 2014.07.14
반응형

Q. 간단한 도서 관리용 프로그램을 작성하라. [제목, 저자명, 페이지수]에 대한 정보를 저장할 수 있는 구조체를 정의하고, 구조체 배열을 선언하여 도서에 대한 정보를 저장하는 구조를 작성해 보자. main함수에서는 사용자로부터 3권의 도서에 대한 정보를 입력받고, 입력이 끝나면 도서에 대한 내용을 출력해 주도록 하자.





   이름을 저장할 배열, 제목을 저장할 배열, 페이지 수를 저      장할 인트형 변수를 구조체로 정의한다.







main 함수에서


구조체를 한번에 담을 배열을 선언하고,


반복문을 사용하여 입력받는다.















출력부분













#printf, scanf 입출력함수를 사용하여 빈칸은 인정이 안되므로 주의하자(빈칸까지 수용하려면 putchar, getchar을 이용하라)


-결과창-










반응형
반응형

Q.야구게임을 컴퓨터와 할 수 있도록 프로그램을 작성해보자

>>개요 

컴퓨터가 0부터 9까지의 수 중에서 랜덤으로 세 숫자를 고르고, 사용자는 이것을 맞추는 게임이다. 숫자와 순서까지 모두 맞춰야하는데, 말할때마다 얼마나 비슷한지 알려주어야 한다.




배열 3자리를 선언하고 1부터 9까지의 수를 하나 랜덤으로 받는다. 단, 각 자리의 숫자가 중복되지 않게 앞자리 수와 같으면 다시 반복문을 돌려 다른 랜덤한 수를 받는다.






 컴퓨터가 세자리를 다 골랐다면, 게임을 시작한다. 무한 반복문 안에서 돌려 자신이 예상한 수를 입력하게한다. com배열과 usr배열을 순차적으로 방문하면서 수가 같으면서 자리까지 같으면 strike(str)변수를 하나 증가시켜주고, 숫자는 같은데 자리가 다르다면 ball변수를 하나 더해준다. 그런다음 결과를 알려준다. 만약 세자리 숫자와 순서가 모두 같을 경우,(3strike라면) 반복문을 빠져나와 게임을 종료한다.


-결과창- 


반응형
반응형



<제 10회 해킹캠프>

날짜: 2014년 8월 30일(토) ~ 31일(일) 1박 2일 
장소: 서울시 서울유스호스텔

아직 정확한 일정은 나오지 않았지만 신청은 가능하네요^^ 8월 20일까지

9회때도 지원했지만, 떨어져서 참 아쉬웠는데 이번엔 꼭 붙었으면!!

후기를 봤더니 정말 유익하고 재밌다네요

신청합시다!!  >> http://www.hackingcamp.org/register.html(자세한 정보도 이곳에서~)



반응형
반응형

Q. 사용자로부터 가위 바위 보 중에서 하나를 입력 받은 후, 컴퓨터는 난수 생성을 통해서 가위 바위 보 중 하나를 선택하게 한다. 이 둘을 비교하여 승자와 패자를 가려라. 프로그램의 진행은 사용자가 질 때까지 계속되고, 게임을 결과를 출력해야 한다.


>>난수 발생 함수와 간단한 조건문을 사용하여 가위바위보 프로그램을 만들 수 있다.



사람이 질때까지 가위바위보를 반복해야 하므로 무한 반복문을 사용하여 만약 사람이 질 경우 break; 문을 사용하여 반복문을 빠져나오도록 하자. 또한 게임의 결과를 출력하기 위하여 변수를 따로따로 설정하여 이길경우 win변수를 1더해주고, 비길경우 moo변수를 1더해준다.


-결과창-




반응형

+ Recent posts

반응형
반응형