김보안의 블로깅
  • 🏠 Home
  • 📚 Project
    • Blockchain
      • 🎦 PickMe
      • 🎦 IoTC
      • 🎦 Blackchain
      • 📃 Gemology
      • 🎦 PickMe
      • 🎦 PickMe
    • AI
      • 👋 A.I. Dream Reader
      • 🎦 A.I. Dream Reader
    • Security
      • 🎦 SNAC
    • Education
      • 🎦 Smart Lecture
  • 🤸‍♂ Hobby
    • Music
      • Violin
      • Guitar
      • Piano
      • Drum
    • Flower
      • Flower Certificate
    • Sport
      • Ski
      • Skateboard
      • Golf
      • Boxing

2020년 5월 20일 수요일

[Windows Batch Script] 하위 디렉토리 포함 특정 확장자를 제외하고 모두 삭제하는 방법

 SecureKim     오후 4:30     윈도우, 파일삭제, 확장자, Batch, delete, ext, extension, windows     No comments   


윈도우에서 하위 디렉토리 포함해서 특정 확장자를 제외한 모든 파일을 삭제하는 스크립트
Windows Batch script to delete all except certain extensions recursively

특정 파일들을 삭제하는건 del 명령을 사용하면 쉽게 할 수 있는데요.
특정 파일들을 제외하고 삭제하는 프로그램은 잘 없어서 공유합니다. 
제가 만들었고 저작권 없으니 마음껏 쓰세요.


@echo off
title Securekim
set ROOTDIR=%1
goto EXECUTE

:USAGE
echo Usage   : %0 {DIR} {EXTs}
echo Example : %0 testDir\myDel .java .kt
exit /b 0

:EXECUTE
for /f "tokens=1,* delims= " %%a in ("%*") do set ALL_BUT_FIRST=%%b
if NOT DEFINED ROOTDIR goto USAGE
if NOT DEFINED ALL_BUT_FIRST goto USAGE
echo Do you really want to delete all files without %ALL_BUT_FIRST% in "%ROOTDIR%"?
pause
echo.
echo Deletion process will be started. All files will be deleted without your exts. 
echo If directory is huge, It takes a long time.
echo This solution doesnt work on files with non-roman characters such as korean or japanese.
echo.
for /f "delims=" %%F in ('dir %ROOTDIR% /s /b /a-d ^|findstr /vile "%ALL_BUT_FIRST%"') do del /F "%%F"
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg

2020년 5월 13일 수요일

구글 블로그(블로거)에서 프로그램 수학 기호 예쁘고 쉽게 넣는 방법

 SecureKim     오후 2:50     구글 블로그, 기호, 블로거, 수학, 특수문자, Blogger, Latex, math     2 comments   


저번 글에 이어서 수학 기호를 LaTeX 스타일로 예쁘게 보여주는 방법을 포스팅한다.

이번 포스팅의 목표는 아래처럼 MathJax를 이용해 글마다 HTML 따로 설정하는것 없이

$ 또는 \ 특수문자를 사용하여 수학 문자를 쉽게 표기 할 수 있도록 하는 것이다.

근의 공식
$$x = {-b \pm \sqrt{b^2-4ac} \over 2a}$$
$$x = {-b \pm \sqrt{b^2-4ac} \over 2a}$$

행렬
\begin{pmatrix}
 1 & a_1 & a_1^2 & \cdots & a_1^n \\
 1 & a_2 & a_2^2 & \cdots & a_2^n \\
 \vdots  & \vdots& \vdots & \ddots & \vdots \\
 1 & a_m & a_m^2 & \cdots & a_m^n    
 \end{pmatrix}
\begin{pmatrix}
 1 & a_1 & a_1^2 & \cdots & a_1^n \\
 1 & a_2 & a_2^2 & \cdots & a_2^n \\
 \vdots  & \vdots& \vdots & \ddots & \vdots \\
 1 & a_m & a_m^2 & \cdots & a_m^n 
 \end{pmatrix}

MathJax 를 사용하면 좋은 점 중에 하나가, 다음과 같이 수식을 우클릭 한 뒤

LaTeX 등 다른 형태로 나타낼 수 있고 복사도 할 수 있다는 점이다.





마찬가지로 테마 - HTML 설정으로 부분 안쪽에 설정을 해주면 

이후 글마다 따로 설정을 안해줘도 된다.

블로거 - 테마 - HTML 편집 - 테마 저장


마찬가지로 아래에 독자를 위한 복붙용 코드를 제공한다.
  
  
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg

구글 블로그(블로거)에서 프로그램 언어 코드 예쁘고 쉽게 넣는 방법 - 1

 SecureKim     오후 2:10     구글, 블로거, 코드 넣기, 코드 삽입, Blogger, Code, Program     2 comments   


이전부터 구글 블로거에서 쓰고 있던 아름다운 표시 방법을 정리한다.

이것은 다른 블로그 사이트도 비슷하게 적용 가능하다.

이번 포스팅에서는 SyntaxHighlither를 이용, 글 쓸 때 아래처럼 HTML 편집을 선택하고



코드의 시작과 끝에 다음과 같이 선언만 해 주면 코드가 예쁘게 보이도록 할 것이다.

원하는 Javascript 코드
그런데 프로그래밍 언어 마다 예약어가 다르므로,
언어에 맞는 색깔을 칠하기 위해서는 해당 언어에 해당하는 Brush를 설정해 주어야 한다.
http://alexgorbatchev.com/SyntaxHighlighter/manual/brushes/

이 설정을 전역적으로 적용해 주기 위해서,
blogger.com 에 접속해서 테마 - HTML편집을 누르고
코드의 HEAD 부분에 Core css, Core js, 원하는 브러시의 js 파일을 지정 한다.



독자들을 위해 아래에 복붙 가능한 코드를 제공하도록 하겠다.
필자의 경우 Cpp, Java, JScript, Python, Bash, HTML 을 사용하므로 아래와 같이 설정했다.

그리고 본 예제는 DJango 테마를 선택했는데, 테마가 더 많이 존재한다.
따라서 이중에 블로그에 잘 맞는 테마를 선택해서 넣으면 된다.
http://alexgorbatchev.com/SyntaxHighlighter/manual/themes/

또한 HTML 사용시 주의할 점이 있는데, <script ~~~ />로 된 단일 코드를 인식하지 못한다는 점이다.
따라서 <script> </script> 와 같이 꼭 닫는 코드를 넣어 주어야 한다.


속도를 좀 더 빠르게 하는 방법

ㆍ이렇게 전역으로 지정하지 않고, 글 마다 HTML 코드에 넣어주고 필요한 코드만 적용해 주면 속도가 더 빠르지만 매우 귀찮으며, 테마나 Syntax 툴을 바꾸려면 모든 글을 수정해야 하므로 엄청난 비효율이다.

ㆍ참고로 http://alexgorbatchev.com/pub/sh/current/ 같이 현재 최신 버전을 로딩 하게 해도 되는데, 결국 3_0_83 버전으로 리다이렉트 되면서 시간이 소요되므로 비추.

ㆍ코드를 Minify 해서 js 코드를 직접 형태로 넣어주면 파일 다운로드 횟수가 줄기 때문에 좀 더 빨라진다.


다음 회차에서는 수학 기호를 예쁘게 넣는 방법에 대해서 알아본다.


Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg

2020년 5월 12일 화요일

메이플스토리M 강화 확률 시뮬레이션 계산기

 SecureKim     오후 5:39     계산기, 메이플, 메이플스토리M, 모바일, 시뮬레이션, 확률, Maplestory     No comments   


이제는 접은 메이플스토리M...

2년전에 메이플스토리M 게임을 하다가,

자꾸 너무 말도 안되는 확률로 무기가 여러번 깨지자

도대체 이 게임의 확률은 조작인가 아닌가를 밝혀내기 위해서 시뮬레이션 프로그램을 만들었었다.

개인적인 결론은 확률 조작이었지만,

고객사에 물어보니 당연히 아니라고 했다.

지금도 잘 동작 하는지 모르겠지만, 여튼 아래 코드를 공개한다.

먼저 설명이다.


1. 메이플의 아이템 강화 방식 소개

ㆍ아이템 강화에 성공하면 "별" 이 하나 증가하면서 능력치가 상승하는 시스템이다.
아이템 강화에 실패하면 이후 두가지 케이스로 나뉜다.

ㆍ희박한 확률로 깨지거나, 비교적 높은 확률로 별이 하락한다.
대신에 강화할 때 두가지 기능을 사용할 수 있다.
하나는 주문서이고, 다른 하나는 스타캐치이다.

ㆍ주문서는 럭키데이 / 하락방지 / 파괴방지로 나뉘며 사용시 각각
강화 확률 증가 / 별 하락 확률 0% / 파괴될 확률 0% 가 된다.
이 주문서는 따로 사용해도 되고 같이 사용해도 되는데 매우 비싸다.

ㆍ스타캐치는 강화시 할 수 있는 타이밍 맞추기 미니 게임이다.
사용자가 타이밍을 잘 맞추면 강화 확률 +5% 가 추가로 주어진다.


2. 시뮬레이션 프로그램

수 많은 사람들이 아이템 "강화" 에 도전하는 시나리오를 가상으로 시뮬레이션 한다.

ㆍ사람들은 각각 주어진 주문서를 갖고 시작별에서 시작하여 목표별로 강화를 도전한다.

ㆍ동일인이라도 각 강화마다 스타캐치는 확률에 따라 일어난다
(만약 스타캐치를 항상 성공할 자신이 있는 경우 100 을 입력한다.)
ㆍ주문서가 없는 경우나 주문서가 있어도 현재 5별 이하이면 주문서 없이 강화한다.

ㆍ각 주문서는 아끼다가 목표치에 가까워지면 일제히 사용한다.
( 목표까지 3별 남았다면 주문서가 3개 이상 있을때만 사용 )
( 2별 남았는데 럭데 1개, 하방 2 개, 파방 3개 있으면 럭데는 아끼고 하방, 파방 사용 )

ㆍ상세 로그를 켜지 않으면 최종 리포트만 출력한다.
(가장 운 좋은 사람의 경우, 평균적인 경우, 가장 운 나쁜 사람의 경우가 나온다)

ㆍ로그를 켜면 어떻게 해당 별에 도달하게 되었고 언제 주문서를 썼는지 자세히 확인 가능하다.


3. 결과

수십만명의 사람으로 시도해본 결과, 내가 겪은 케이스를 똑같이 겪은 사람은

몇십명 밖에 되지 않았다. 그러니 이론상 나는 수만분의 1확률로 극악의 케이스를 겪은 행운의 사나이다.

하지만 내 주위에 이 게임을 하는 사람들이 많았는데, 똑같이 또는 더 심한 극악의 케이스를 자주 겪곤 했다.

판단은 여러분께 맡긴다.

/*
Copyright (c) 2018 admin@securekim.com
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
강화 계산기
1. 총 몇명이 도전할 지 선택.
2. 시작별 입력
3. 목표별 입력
4. 스타캐치 성공 확률 입력 (0~100)
5. 각 줌서 (럭데, 하방, 파방) 갯수 입력
6. 상세 로그 선택
*/

#include
#include
#include
#include
#include
using namespace std;
int REINFORCE[21][4] = {
  { 0, 0, 0, 0 },       //STAR 0
  { 95, 5, 0, 0 },      //STAR 1
  { 90, 10, 0, 0 },     //STAR 2
  { 85, 15, 0, 0 },     //STAR 3
  { 80, 20, 0, 0 },     //STAR 4
  { 75, 25, 0, 0 },     //STAR 5
  { 65, 15, 15, 5 },    //STAR 6
  { 60, 20, 15, 5 },    //STAR 7
  { 55, 25, 15, 5 },    //STAR 8
  { 50, 30, 15, 5 },    //STAR 9
  { 45, 35, 15, 5 },    //STAR 10
  { 35, 45, 15, 5 },    //STAR 11
  { 30, 50, 15, 5 },    //STAR 12
  { 25, 55, 15, 5 },    //STAR 13
  { 20, 60, 15, 5 },    //STAR 14
  { 15, 65, 15, 5 },    //STAR 15
  { 10, 70, 15, 5 },    //STAR 16
  { 7, 73, 15, 5 },     //STAR 17
  { 5, 75, 15, 5 },     //STAR 18
  { 3, 77, 15, 5 },     //STAR 19
  { 1, 79, 15, 5 }      //STAR 20
};
enum{
  MYNULL,    //0
  BLUE,      //1
  GREEN,     //2
  MAGENTA,   //3
  RED,       //4
  PEACH,     //5
  YELLOW,     //6
  WHITE,     //7
  GRAY,      //8
  LBLUE,     //9
  LGREEN,    //10
  LMAGENTA,  //11
  LRED,      //12
  LPEACH,    //13
  LYELLOW,    //14
  LWHITE     //15
};

HANDLE  hConsole;
int cntsum;
int cnt;
int first = 0, last = 0, start = 0, result = 0;
int LOG = 0;
int myresult[4];
int EVERAGE;
int GOODLUCK = 999999;
int BADLUCK = 0;
int STARCATCH;
//사용한 갯수
int LUCKYDAY;
int SAFETY;
int PROTECT;
//총 결과
int R_LUCK[4];
int R_BAD[4];
int R_EVER[4];
enum{
  PASS,
  NORM,
  FAIL,
  DEST
};
void init(){
  cnt = 0;
  start = first;
  for (int i = 0; i < 4; i++){
    myresult[i] = 0;
  }
}

int goReinforce(int NEXT_RATING, int starcatch, bool luckyday, bool safety, bool protect)
                                 // starcatch / luckyday     / safety          / protect
                                 // +5 -5 0 0 / +10 -10 0 0  / 0 +15 -15 0     / 0 +5 0 -5 
                                 // 0 ~ 5 성까지는 사용하지 않도록 강제
                                 // 현재가 5성 이상일때 부터 마지막 목표치 이전에 남아 있는 경우 사용.
                                 // starcatch 확률 입력 가능
                                
{
  double r = rand() / (double)RAND_MAX; //{0.0 - 1.0}
  double dr = r * 100.0f; // {0.0 - 100.0}
  double r2 = rand() / (double)RAND_MAX; //{0.0 - 1.0}
  double dr2 = r2 * 100.0f; // {0.0 - 100.0}
  NEXT_RATING = NEXT_RATING > 20 ? 20 : NEXT_RATING;
 
  int TMP_REINFORCE[4];
  TMP_REINFORCE[PASS] = REINFORCE[NEXT_RATING][PASS];
  TMP_REINFORCE[NORM] = REINFORCE[NEXT_RATING][NORM];
  TMP_REINFORCE[FAIL] = REINFORCE[NEXT_RATING][FAIL];
  TMP_REINFORCE[DEST] = REINFORCE[NEXT_RATING][DEST];
   
  double cumulative = 0.0f;
  cumulative += starcatch;
  if (dr2 <= cumulative){
    if (LOG > 0){
      SetConsoleTextAttribute(hConsole, MAGENTA);
      cout << "[ USE ] STAR CATCH +5%" << endl;
    }
    TMP_REINFORCE[PASS] += 5;
    TMP_REINFORCE[NORM] -= 5;
  }
  if (luckyday){
    TMP_REINFORCE[PASS] += 10;
    TMP_REINFORCE[NORM] -= 10;
  }
  if (safety){
    TMP_REINFORCE[NORM] += 15;
    TMP_REINFORCE[FAIL] -= 15;
  }
  if (protect){
    TMP_REINFORCE[NORM] += 5;
    TMP_REINFORCE[DEST] -= 5;
  }

  TMP_REINFORCE[PASS] = TMP_REINFORCE[PASS] > 100 ? 100 : TMP_REINFORCE[PASS];
  TMP_REINFORCE[NORM] = TMP_REINFORCE[NORM] > 100 ? 100 : TMP_REINFORCE[NORM];
  TMP_REINFORCE[NORM] = TMP_REINFORCE[NORM] < 0 ? 0 : TMP_REINFORCE[NORM];
  TMP_REINFORCE[FAIL] = TMP_REINFORCE[FAIL] < 0 ? 0 : TMP_REINFORCE[FAIL];
  TMP_REINFORCE[DEST] = TMP_REINFORCE[DEST] < 0 ? 0 : TMP_REINFORCE[DEST];
  cumulative = 0.0f;
  for (int i = 0; i<4 br="" i="">  {
    cumulative += TMP_REINFORCE[i];
    if (dr <= cumulative)
    {
      return i;
    }
  }
}

int main(){
 
 
  hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(hConsole, MAGENTA);
  srand(time(NULL));
  int TOTAL;
  cout << endl;
  cout << "======================================" << endl;
  cout << "  Reinforce calculator ver 1.0" << endl <  cout << "  LAST RELEASE : 2018. 03. 20" << endl;
  cout << "  DEVELOPER    : UNION / 쇠가시" << endl;
  cout << "  CONTACT      : admin@securekim.com" << endl;
  cout << "======================================" << endl;
  cout << endl;
  SetConsoleTextAttribute(hConsole, WHITE);
  int my_starcatch;
  int my_luckyday;
  int my_safety;
  int my_protect;
  int tmp;
  int tmp_luckyday;
  int tmp_safety;
  int tmp_protect;
  bool flag_luckyday;
  bool flag_safety;
  bool flag_protect;
  // starcatch / luckyday     / safety          / protect
  cout << "TOTAL PEOPLE :" << endl;
  cin >> TOTAL;
  cout << "START STAR :" << endl;
  cin >> first;
  cout << "LAST STAR :" << endl;
  cin >> last;
  cout << "STAR CATCH SUCCESS PERCENT (0 ~ 100):" << endl;
  cin >> my_starcatch;
  cout << "How many LUCKYDAYs do you have ? :" << endl;
  cin >> my_luckyday;
  cout << "How many SAFETYs do you have ?:" << endl;
  cin >> my_safety;
  cout << "How many PROTECTs do you have ?" << endl;
  cin >> my_protect;
  cout << "Get Detail Log ? (YES : 1, NO :0) :" << endl;
  cin >> LOG;
  cout << "[START] " << first << " ------> " << last << endl;
  for (int TC = 1; TC <= TOTAL; TC++) // 한사람
  {
    init();
    if (LOG > 0){
      cout << "=== [ DETAIL LOG ] " << first << " ---> " << last << endl;
    }
    tmp_luckyday = my_luckyday;
    tmp_safety = my_safety;
    tmp_protect = my_protect;
    while (start < last) // 한번 완성되는 경우
    {
      cnt++;
      cntsum++;
      flag_luckyday=0;
      flag_safety=0;
      flag_protect=0;
      if (start >= 5 && tmp_luckyday > 0 && tmp_luckyday >= (last - start)){
        tmp_luckyday--;
        flag_luckyday = 1;
        if (LOG > 0){
          SetConsoleTextAttribute(hConsole, PEACH);
          cout << "[ USE ] " << "LUCKY DAY SHEET " << tmp_luckyday + 1 << " -> " << tmp_luckyday << endl;
        }
      }
      if (start >= 5 && tmp_safety > 0 && tmp_safety >= (last - start)) {
        tmp_safety--;
        flag_safety=1;
        if (LOG > 0){
          SetConsoleTextAttribute(hConsole, PEACH);
          cout << "[ USE ] SAFETY SHEET " << tmp_safety + 1 << " -> " << tmp_safety << endl;
        }
      }
      if (start >= 5 && tmp_protect > 0 && tmp_protect >= (last - start)) {
        tmp_protect--;
        flag_protect=1;
        if (LOG > 0){
          SetConsoleTextAttribute(hConsole, PEACH);
          cout << "[ USE ] " << "PROTECT SHEET " << tmp_protect + 1 << " -> " << tmp_protect << endl;
        }
      }
      result = goReinforce(start + 1, my_starcatch, flag_luckyday, flag_safety, flag_protect);
      myresult[result]++;
      if (result == PASS){
        if (LOG > 0){
          SetConsoleTextAttribute(hConsole, LMAGENTA);
          cout << " [ "<< cnt <<" - PASS ] " << start << " ---> " << start + 1 << endl;
        }
        start++;
      }
      else if (result == NORM){
        if (LOG > 0){
          SetConsoleTextAttribute(hConsole, YELLOW);
          cout << " [ " << cnt << " - NORM ] " << start << " ---> " << start << endl;
        }
      }
      else if (result == FAIL){
        if (LOG > 0){
          SetConsoleTextAttribute(hConsole, RED);
          cout << " [ " << cnt << " - FAIL ] " << start << " ---> " << start - 1 << endl;
        }
        start--;
      }
      else if (result == DEST){
        if (LOG > 0){
          SetConsoleTextAttribute(hConsole, LRED);
          cout << " [ " << cnt << " - DEST ] " << start << " ---> " << start << endl;
        }
      }
    }


    if (LOG > 0){
      SetConsoleTextAttribute(hConsole, WHITE);
      cout << "\n=== [ RESULT ] " << first << " ------> " << last << " (" << cnt << ") " << endl;
      cout << " PASS " << myresult[PASS] << endl;
      cout << " NORM " << myresult[NORM] << endl;
      cout << " FAIL " << myresult[FAIL] << endl;
      cout << " DEST " << myresult[DEST] << endl;
      cout << "==================================" << endl;
    }
    for (int i = 0; i < 4; i++)
    {
      if (cnt >= BADLUCK){
        BADLUCK = cnt;
        R_BAD[i] = myresult[i];
      }
      if (cnt <= GOODLUCK){
        GOODLUCK = cnt;
        R_LUCK[i] = myresult[i];
      }
      R_EVER[i] += myresult[i];
    }
  }
  SetConsoleTextAttribute(hConsole, LWHITE);
  cout << "\n\n======= [ FINAL REPORT " << first << " ---> " << last << " with " << TOTAL << " people ]==========" << endl;
  SetConsoleTextAttribute(hConsole, MAGENTA);
  cout << "== [ BEST LUCK - "<< GOODLUCK <<" TRY ]"<< endl;
  cout << " PASS " << R_LUCK[PASS] << endl;
  cout << " NORM " << R_LUCK[NORM] << endl;
  cout << " FAIL " << R_LUCK[FAIL] << endl;
  cout << " DEST " << R_LUCK[DEST] << endl;
  SetConsoleTextAttribute(hConsole, GREEN);
  cout << "== [ EVERAGE - " << (double)cntsum / (double)TOTAL << " TRY ]" << endl;
  cout << " PASS " << (double)R_EVER[PASS] / (double)TOTAL << endl;
  cout << " NORM " << (double)R_EVER[NORM] / (double)TOTAL << endl;
  cout << " FAIL " << (double)R_EVER[FAIL] / (double)TOTAL << endl;
  cout << " DEST " << (double)R_EVER[DEST] / (double)TOTAL << endl;
 
  SetConsoleTextAttribute(hConsole, RED);
  cout << "== [ WORST LUCK - " << BADLUCK << " TRY ]" << endl;
  cout << " PASS " << R_BAD[PASS] << endl;
  cout << " NORM " << R_BAD[NORM] << endl;
  cout << " FAIL " << R_BAD[FAIL] << endl;
  cout << " DEST " << R_BAD[DEST] << endl;
  SetConsoleTextAttribute(hConsole, LWHITE);
  cout << "=============================================================" << endl;
  cin >> tmp;
}


Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg

삼성 타이젠 MiTM 인증서 검증 버그 및 취약점

 SecureKim     오후 5:14     삼성, 취약점, 타이젠, MITM, Samsung, Security, Tizen, vulnerability     No comments   


15년 12월 중순, 내가 리포트 했던 타이젠 웹 인증서 검증 버그가 있었다.


이것은 사용자가 브라우저 사용시 MiTM을 막을 수 없는 취약점으로,

MiTM시 인증서 검증 이후 SSL 관련 경고창은 띄우지만

경고창과 무관하게 데이터가 날아가는 취약점이었다.


이 공격은 당시 모든 타이젠 브라우저에 가능했으며,

유저는 HTTPS 를 사용하더라도 공격을 당할 수 밖에 없는 매우 심각한 취약점이다.

그런데 이것을 단지 일개 신입사원이 발견한 것이었다.

(그렇다고 뭐 보상이나 격려 같은건 전혀 없었지만)


여튼 이제 모두 패치되었지만 5년전, 타이젠에는 이런일도 있었다는 것을 기록한다.


-------------------------------------------------------------------

어느날 타이젠에 MiTM 공격을 시도 해 보았다.

이후 웹에서 인증서 검증을 하고 아래처럼 경고창을 띄우는 것을 확인 했고,




평소라면 "아, 경고창 뜨네. 공격 검증하네." 하고 넘어 갔겠지만

시스템에 대한 믿음이 없던 나는 데이터를 직접 확인 해 보기로 했다.



패킷 확인 결과, 인증서 검증 후

경고창은 띄웠지만 데이터는 날아가는 황당한 장면을 목격하게 되었다.

즉, 만약 아이디 패스워드를 입력하는 페이지에서 MiTM을 당한다면

사용자가 경고창을 보고 Deny를 하더라도 이미 아이디 패스워드는 탈취 되는 것이다.



Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
최근 게시물 이전 게시물 홈

페이지

  • 홈
  • Hobby

Categories

  • AI
  • android
  • AWS
  • Blockchain
  • Hardware
  • Javascript
  • mysql
  • Node.js
  • Plasma
  • review
  • Security
  • Study
  • Video
  • windows

Popular Posts

  • 블랙보드 강의 녹화 영상 다운로드 가능한 방법 (노설치)
    별도의 설치도 필요 없고 아주 쉽습니다. 구글 크롬브라우저 에서 블랙보드 녹화 영상에  다운로드 가능한 메뉴가 나오게 하는 코드입니다.  먼저 블랙보드 강의자료에 입장하고, 재생 버튼을 클릭 하지 않은 상태로 F12 를 입력합니다. 재생을 클릭하지 마세요.
  • [Node.js] Redis 의 hmset
    Redis 의 hmset 사용하기 var redis = require('redis'); var client=redis.createClient(포트,호스트,null); /* * MySQL을 사용하다가 Redis를 사용해보니 신세...
  • 안드로이드 음성 소켓 통신 (2월 단기)
    안드로이드-음성을 패킷화 하여 P2P 소켓 통신. 처음엔 TCP로 구현했었는데 서버 과부하를 줄일 수 있도록 P2P로 구현하겠노라 큰소리 쳤습니다. P2P는 홀펀칭이 필요하며 따라서 TCP로는 어렵다는 것을 알게 되었죠. 각 단말...

Blog Archive

  • ►  2023 (1)
    • ►  1월 (1)
  • ►  2022 (10)
    • ►  12월 (1)
    • ►  11월 (3)
    • ►  9월 (1)
    • ►  8월 (1)
    • ►  6월 (2)
    • ►  3월 (2)
  • ►  2021 (9)
    • ►  12월 (3)
    • ►  11월 (1)
    • ►  6월 (1)
    • ►  5월 (2)
    • ►  4월 (2)
  • ▼  2020 (12)
    • ►  10월 (1)
    • ►  9월 (2)
    • ►  7월 (1)
    • ►  6월 (1)
    • ▼  5월 (5)
      • [Windows Batch Script] 하위 디렉토리 포함 특정 확장자를 제외하고 모두 ...
      • 구글 블로그(블로거)에서 프로그램 수학 기호 예쁘고 쉽게 넣는 방법
      • 구글 블로그(블로거)에서 프로그램 언어 코드 예쁘고 쉽게 넣는 방법 - 1
      • 메이플스토리M 강화 확률 시뮬레이션 계산기
      • 삼성 타이젠 MiTM 인증서 검증 버그 및 취약점
    • ►  4월 (1)
    • ►  2월 (1)
  • ►  2019 (14)
    • ►  10월 (2)
    • ►  7월 (1)
    • ►  3월 (4)
    • ►  2월 (2)
    • ►  1월 (5)
  • ►  2018 (14)
    • ►  12월 (2)
    • ►  11월 (4)
    • ►  10월 (1)
    • ►  8월 (2)
    • ►  5월 (4)
    • ►  1월 (1)
  • ►  2017 (12)
    • ►  10월 (2)
    • ►  9월 (9)
    • ►  5월 (1)
  • ►  2016 (8)
    • ►  10월 (2)
    • ►  8월 (1)
    • ►  6월 (1)
    • ►  1월 (4)
  • ►  2015 (6)
    • ►  12월 (3)
    • ►  10월 (1)
    • ►  6월 (1)
    • ►  5월 (1)
  • ►  2014 (10)
    • ►  11월 (1)
    • ►  9월 (1)
    • ►  7월 (1)
    • ►  6월 (1)
    • ►  5월 (3)
    • ►  4월 (1)
    • ►  3월 (2)
  • ►  2013 (28)
    • ►  12월 (3)
    • ►  11월 (6)
    • ►  10월 (6)
    • ►  9월 (6)
    • ►  8월 (1)
    • ►  7월 (3)
    • ►  6월 (3)

구독

글
Atom
글
전체 댓글
Atom
전체 댓글

로드 중입니다...

각오

직접 해보지 않은 것은 포스팅 하지 않겠습니다.

Copyright © 김보안의 블로깅 | Powered by Blogger
Design by Hardeep Asrani | Blogger Theme by NewBloggerThemes.com | Distributed By Gooyaabi Templates