접속자 아이피를 가져오기 위해 request-ip 모듈을 사용한다. 

request-ip 모듈은 다음과 같은 명령어로 추가할 수 있다.

#npm install request-ip --save

 

다음과 같이 서버 코드를 작성하고, 웹 서버에 접속하면 접속한 클라이언트의 아이피를 가져올 수 있다.

var express = require('express');
var requestIp = require('request-ip');
var app = express();

app.get('/main', function(req, res){
  res.send('main page')
  console.log("client IP: " +requestIp.getClientIp(req));
})

app.listen(3003, function(){
  console.log("Express server started at port 3003");
});

request-ip 모듈의 getClientIP() 함수를 사용하여 접속자의 아이피를 가져올 수 있다.

'Web > Develop' 카테고리의 다른 글

[Javascript] serialization(직렬화)  (0) 2020.11.04
[Javascript] IIFE  (0) 2020.10.28
[Javascript] 사칙연산 계산기  (0) 2020.08.21
[PHP] isset()  (0) 2020.06.14
[PHP] PDO로 데이터베이스(mysql) 연결  (0) 2020.06.14
연산자 연산자의 기능
= 연산자 오른쪽의 값을 왼쪽에 있는 변수에 대입한다.
num = 20;
+ 두 피연산자의 값을 더한다.
num = 4+3;
- 왼쪽의 피연산자 값에서 오른쪽의 피연산자 값을 뺀다.
num = 20 - 10;
* 두 피연산자의 값을 곱한다.
num = 4 * 2;
/ 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눈다.
num = 8 / 4;
% 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눴을 때 얻게되는 나머지 값을 반환한다.
num = 5 % 2

 

복합 대입 연산자

다른 연산자와 합쳐진 형태의 대입연산자를 복합 대입 연산자라 한다.

#include <stdio.h>

int main(void){
  int num1 = 2, num2 = 4, num3 = 6;
  num1 += 3;  // num1 = num1 + 3;
  num2 *= 4;  // num2 = num2 * 4;
  num3 %= 5;  // num3 = num3 % 5;
  printf("Result : %d, %d, %d \n",num1, num2, num3);
  return 0;
}
// output : Result : 5, 16, 1 

위 코드처럼 num1의 연산 결과를 다시 num1에 저장하는 연산식 같은 경우는 복합 대입 연산자를 이용하면 더 간략하게 표현할 수 있다.

 

+연산자와 -연산자는 정수 표현에서 음의 정수와 양의 정수를 표현하기 위해 사용되기도 한다.

 

증가, 감소 연산자

변수명이 num이라 할 때 num++는 후위증가, ++num은 전위증가 라고 한다.

#include <stdio.h>

int main(void){
  int num1 = 12, num2 = 12;

  printf("num1 : %d \n", num1);
  printf("num1++ : %d \n", num1++);	// 후위증가
  printf("num1 : %d \n", num1);

  printf("num2 : %d \n", num2);
  printf("++num2 : %d \n", ++num2);	// 전위증가
  printf("num2 : %d \n", num2);
  return 0;
}
/*
output:
num1 : 12
num1++ : 12
num1 : 13
num2 : 12
++num2 : 13
num2 : 13
*/

후위증가의 경우에는 printf()함수가 먼저 실행되고 연산이 진행된다. 또한 전위증가의 경우에는 연산이 먼저 진행되고, printf() 함수가 실행된다.  이와 같은 방식은 -- 연산자로도 사용이 가능하다.

#include <stdio.h>

int main(void){
  int num1 = 10;
  int num2 = (num1--)+2;

  printf("num1 : %d, num2 : %d\n", num1, num2);
  return 0;
}
// output : num1 : 9, num2 : 12

위 코드의 num2 변수에서도 num1--는 후위감소이기 때문에 먼저 num1 + 2 의 연산을 진행하고 후에 num1이 1 감소되었다. 후위 증가 및 후위 감소의 연산에서는 소괄호의 영향을 받지 않고, 다음 문장으로 넘어가야 값의 증가 및  감소가 이루어진다.

 

관계연산자

관계연산자는 값의 대소나 동등의 관계를 따지는 연산자이다. 관계 연산자는 비교 연산자 라고도 한다.

연산자 연산자의 기능
< a < b
a가 b 보다 작은가?
a > b
a가 b보다 큰가?
== a == b
a와 b가 같은가?
!= a != b
a와 b가 다른가?
<= a <= b
a가 b보다 작거나 같은가?
>= a >= b
a가 b보다 크거나 같은가?

관계연산자들은 조건을 만족하면 1을, 만족하지 않으면 0을 반환한다. 1은 참(true)을 의미하고, 0은 거짓(false)을 의미한다. 

#include <stdio.h>

int main(void){
  int num1 = 10, num2 = 12;
  int res1, res2, res3;

  res1 = (num1 == num2);
  res2 = (num1 <= num2);
  res3 = (num1 > num2);

  printf("res1 : %d\n", res1);
  printf("res2 : %d\n", res2);
  printf("res3 : %d\n", res3);

  return 0;
}
/*
output :
res1 : 0
res2 : 1
res3 : 0
*/

 

논리연산자

AND(논리곱), OR(논리합), NOT(논리부정)을 표현하는 연산자이다.

연산자 연산자의 기능
&& A && B
A와 B가 모두 참이면 참을 반환한다.(논리 AND)
|| A || B
A와 B 둘 중 하나라도 참이면 참을 반환한다.(논리 OR)
! !A
A가 참이면 거짓, 거짓이면 참을 반환한다.(논리 NOT)

논리 연산자 보다 관계 연산자가 먼저 수행된다. result = (1 < 10) && (2 == 2)의 경우에는 두 식이 모두 참이기 때문에 result 값은 1이된다. 또한 C는 0이 아닌 값은 모두 참으로 간주하기 때문에 result = !10 과 같은 경우 참(10)을 부정했기 때문에 result 값은 0이된다.

'Language > C, C++' 카테고리의 다른 글

[C] 키워드  (0) 2020.11.21
[C] scanf()  (0) 2020.11.21
[C] 변수  (0) 2020.11.18
[C] printf()  (0) 2020.11.18
[C] 주석  (0) 2020.11.17

C에서 변수가 의미하는 것은 값을 저장할 수 있는 메모리 공간에 붙은 이름, 혹은 메모리 공간 자체를 가리키는 것이다.

그래서 변수를 하나 선언하면 변수의 이름을 통해 값의 저장과 참조가 가능하다.

int main(void){
	int num;	// num이라는 이름의 변수 선언
    num = 20;	// 변수 num에 20저장
    printf("%d", num)	// 변수 num의 값 참조
}

위 코드에서 int는 정수 저장이 가능한 메모리를 할당한다는 의미이고, num은 그 메모리 공간의 이름을 num이라고 하겠다는 것이다. C에서 = 기호는 대입 연산자로 값의 대입을 의미한다. 대입연산자가 사용되면 연산자 오른쪽의 값을 왼쪽의 변수에 대입한다. printf()함수에서는 num에 저장된 값  20이 출력된다. 선언된 변수에 처음 값을 대입하는 것을 초기화 라고 한다. 초기화 후 저장된 값은 변경 가능하다.

 

C에서는 다음과 같이 변수를 선언과 동시에 초기화 하는것, 둘 이상의 변수를 동시에 선언하는 것, 둘 이상의 변수를 동시에 선언 및 초기화 하는 것도 가능하다.

int num1 = 12;	// 선언과 동시에 초기화
int num2, num3;	// 두개의 변수 선언
int num4 = 5, num5 = 20;	// 두개의 변수를 선언 및 초기화

 

#include <stdio.h>

int main(void){
  int num1, num2;
  int num3=30, num4=40;

  printf("num1: %d, num2: %d \n", num1, num2);
  num1 = 10;
  num2 = 20;

  printf("num1: %d, num2: %d \n", num1, num2);
  printf("num3: %d, num4: %d \n", num3, num4);
  return 0;
}
/*
output:
num1: 0, num2: 4200864 
num1: 10, num2: 20 
num3: 30, num4: 40
*/

첫 번째 출력값을 보면 변수를 선언만하고 초기화를 하지 않았을 경우 쓰레기값이 저장될 수 도 있다. 따라서 변수를 선언과 동시에 0으로 초기화 한 후 나중에 필요한 값을 저장하는 방법을 많이 사용하기도 한다.

 

변수 선언 규칙

1. 변수의 이름에는 알파벳, 숫자, 언더바(_)만 사용할 수 있다.(언더바를 제외한 다른 특수문자는 사용할 수 없다.)

2. C는 대소문자를 구분한다. (변수 num 과 변수 NUM은 다른 변수 이다.)

3. 변수의 이름은 숫자로 시작할 수 없다.

4. 키워드는 변수로 사용할 수 없다(키워드 예 : printf, return 등)

5. 변수 이름 사이에는 공백이 사용될 수 없다.

'Language > C, C++' 카테고리의 다른 글

[C] scanf()  (0) 2020.11.21
[C] 연산자  (0) 2020.11.19
[C] printf()  (0) 2020.11.18
[C] 주석  (0) 2020.11.17
[C]Hello World.c  (0) 2020.11.17
#include <stdio.h>

int main(void){
  printf("Hello everybody\n");
  printf("%d\n", 1234);
  printf("%d %d\n", 10, 20);
  return 0;

  /*
  output :
  Hello everybody
  1234
  10 20
  */
}

printf() 함수는 문자열 뿐 아니라 정수 데이터도 출력이 가능하다.

printf() 함수는 첫 번째 인자로 전달된 문자열을 출력한다.

 

위 코드 두번째, 세번째 printf() 함수를 보면 %d 라는 문자가 보이는데 이러한 문자를 서식문자 라고 한다. 서식문자는 출력의 형태를 지정하는 용도로 쓰인다. %d는 10진수 정수 형태의 출력을 의미한다. \n 은 개행을 의미한다. 세번째 printf() 함수에서는 서식문자 %d가 두 개 존재하는데, 두 개의 출력 대상이 두번째, 세번째 인자에서 전달되고 있다.

서식 문자의 사용 위치는 제한이 없어서 다양하게 문자열을 조합하여 출력하는것이 가능하다.

'Language > C, C++' 카테고리의 다른 글

[C] scanf()  (0) 2020.11.21
[C] 연산자  (0) 2020.11.19
[C] 변수  (0) 2020.11.18
[C] 주석  (0) 2020.11.17
[C]Hello World.c  (0) 2020.11.17

주석은 프로그램 내에 삽입된 메모이다. 컴파일 대상에서 제외되어 주석은 프로그램의 실행 결과에 영향을 미치지 않는다. 주석은 자신이 작성한 코드이던, 남이 작성한 코드이던 더 빠르고 쉽게 코드를 이해할 수 있도록 도와주기 때문에 프로그래밍의 필수 요소이다. 

 

C에서 주석 작성 방식

여러줄 주석

/*
	주석처리 된 문장 1
    주석처리 된 문장 2
    주석처리 된 문장 3
*/

 

한줄주석

// 주석처리 된 문장1
// 주석처리 된 문장2
// 주석처리 된 문장3

 

'Language > C, C++' 카테고리의 다른 글

[C] scanf()  (0) 2020.11.21
[C] 연산자  (0) 2020.11.19
[C] 변수  (0) 2020.11.18
[C] printf()  (0) 2020.11.18
[C]Hello World.c  (0) 2020.11.17
#include <stdio.h>

int main(void){
  printf("hello world\n");
  return 0;
}

C언어를 처음 배우게되면 가장 먼저 작성하게되는 프로그램이다. 콘솔창에 hello world 를 출력하는 간단한 프로그램이다. 

C언어 프로그래밍은 C언어로 입력과 그에 따른 출력이 존재하는 함수(function)를 만들고 함수의 실행 순서를 결정하는 일이다. 

 

C로 구현된 프로그램은 항상 main 이라는 함수를 제일 먼저 호출하기 때문에 main 함수는 항상 정의되어 있어야 한다.

위 코드를 보면 int main(void) 에서 int는 출력 형태이고, main은 함수이름, void는 입력 형태이다. 중괄호 내부는 함수의 기능을 정의하고 있고, 중괄호 내에 있는 문장들은 순차적으로 실행된다.

C는 문장의 끝을 표현하기 위해 세미클론(;) 을 사용한다.

 

중괄호 내부의 printf() 함수는 따로 정의하지 않아도 호출이 가능한 표준 함수이다. C에는 많은 수의 표준 함수들이 있고, 표준 함수들을 모아둔 것을 표준 라이브러리 라고 한다.

 

printf()와 같은 표준 함수의 호출을 위해서는 printf()함수와 관련이 있는 헤더파일을 선언해야한다. 위 코드에서 헤더파일 선언은 #include <stdio.h> 이다. 이 선언은 확장자가 .h 로 끝나는 stdio.h 라는 헤더파일을 포함하라는 의미이다. printf()와같은 함수를 사용하기 위해서는 stdio.h라는 헤더파일을 선언해야 한다. 헤더파일의 선언은 소스코드의 맨 앞부분, main함수 정의 전에 선언되어야 한다.

 

return 0; 부분은 return문 이라고 한다. return문은 함수를 호출한 영역으로 값을 전달하고, 현재 실행중인 함수를 종료시키는 역활을 한다. 위 코드에서는 main 함수를 호출한 영역으로 0을 전달하고, main 함수를 종료한다. main 함수의 종료는 프로그램의 종료로 이어지기 때문에 프로그램도 종료된다. 

'Language > C, C++' 카테고리의 다른 글

[C] scanf()  (0) 2020.11.21
[C] 연산자  (0) 2020.11.19
[C] 변수  (0) 2020.11.18
[C] printf()  (0) 2020.11.18
[C] 주석  (0) 2020.11.17

쿠키에 인증 상태가 있는 데이터를 저장하면 쿠키 값을 조작하면 임의 사용자로 인증된 것처럼 요청을 조작할 수 있는 문제가 발생한다. 이러한 문제점을 해결하기 위해 서버에 데이터를 저장하기 위해 세션을 사용한다.

 

데이터를 서버에 저장하고 해당 데이터를 접근할 수 있는 유추할 수 없는 랜덤 문자열 키를 만들어 인증된 클라이언트에 전송한다. 

이 랜덤 문자열 키를 세션 ID라고 한다.

브라우저는 세션 ID를 보통 쿠키에 저장하고, 이후 클라이언트가 서버에 요청을 보낼때 http 헤더에서 세션 ID값이 유효한 세션인지 확인 후  요청을 처리하고 응답한다.

 

 

'Web > Technical' 카테고리의 다른 글

Cookie  (0) 2020.11.14
JSON(JavaScript Object Notation)  (0) 2019.10.18

쿠키는 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터다. 브라우저는 이 데이터(쿠키)들을 저장해 두었다가 동일한 서버에서 재 요청 시 저장된 데이터(쿠키)들을 같이 전송한다.

 

http 프로토콜은 하나의 요청에 하나의 응답을 한 후 네트워크 연결을 끊는 connectionless의 특징과 네트워크가 연결이 끝맺을 때 상태를 유지하지 않는 stateless 속성을 갖기 때문에 http 요청마다 새로운 커넥션을 열어 인증을 계속 해야한다는 단점 때문에 쿠키라는 개념이 생겼다.

 

쿠키생성

쿠키는 http 헤더의 Set-Cookie 헤더로 저장하고, 브라우저는 Cookie 헤더로 저장되있던 쿠키들을 서버로 전송한다.

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: id=phulasso
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: id=phulasso

Javascript의 document.cookie를 통해서도 쿠키를 저장할 수 있다.

document.cookie = "id=phulasso;"

 

쿠키소멸

쿠키를 생성할 때 ; 뒤에 Expires 속성이나 Max-Age 속성으로 삭제 기간을 정할 수 있다.

Set-Cookie: id=phulasso; Expires=Sun, 15 Nov 2020 07:28:00 GMT;

세션 쿠키는 현재 세션이 끝날 때 삭제된다. 어떤 브라우저는 재시작 할때 세션을 복원하여 쿠키가 무기한 존재할 수 있도록 하기도 한다.

'Web > Technical' 카테고리의 다른 글

Session  (0) 2020.11.16
JSON(JavaScript Object Notation)  (0) 2019.10.18

메모리(스택, 힙) 영역에서 쉘 코드의 실행을 막는 보호 기법이다. 

윈도우에서는 DEP (Data Execution Prevention) 라고 불리고, OS X나 리눅스에서는 NX(No-eXcute) bit 이라고 부른다.

이 보호기법이 적용되어 있으면 쉘 코드가 있어도 예외처리가 발생하여 실행되지 않고 종료된다. 

문제를 보면 쿼리 맨 뒤 부분에 and 1=0 이라는 구문이 있어 쿼리가 거짓이 되고 있다. 이 부분을 주석처리를 통해 없애주면 문제를 해결할 수 있을 것 같다. /?pw=' or id='admin'# 이라는 쿼리를 보냈더니 #문자가 들어가지 않아서 #을 헥스값으로 바꾼 %23으로 넣었더니 정상적으로 주석처리가 되며 쿼리가 참이 되서 문제를 해결할 수 있었다.

payload : /?pw=' or id='admin'%23

'Security & Hacking > Wargame' 카테고리의 다른 글

[Hack CTF] x64 Simple_size_BOF  (0) 2021.04.25
[Hack CTF] x64 Buffer Overflow  (0) 2021.04.23
[LoS] vampire  (0) 2020.11.10
[LoS] troll  (0) 2020.11.06
[LoS] orge  (0) 2020.11.06

+ Recent posts