Introduction:

수 많은 인터넷 콘텐츠들, youtube, instagram, 그 외 SNS들, 이메일들.... 바야흐로 우리는 지금 정보 과잉, 집중 방해 요소 과잉 시대 속에 살고 있습니다. 사실 대부분이 '집중한다는 것'을 잊고 사는지도 모릅니다. 그정도로 인터넷 콘텐츠들이 발달했고 무서울 정도로 강력해졌습니다. 이 책은 이러한 시대 속에서, '딥 워크'라는 일종의 몰입 능력에 대해서 강조합니다. 몰입하는 능력, 몰입함으로써 수행하는 작업들이 진정으로 가치를 창출하는 일이고 앞으로 나아가는 길이라고 말합니다.

 

이러한 분들에게 추천합니다:

"나 너무 산만한 것 같은데?"

일이나 공부를 하면서 자꾸만 스마트폰에 손이 가거나, 인터넷을 하거나,

시도 때도 없이 잉여 시간(줄 서있기 등)에 스마트폰을 무조건 킨다거나,

이메일, 카카오톡 등의 메신저에 끊임없이 시달리는 분들께 추천합니다.

 

"진짜 집중해서 뭔갈 해내고 싶다."

어떤 프로젝트나, 공부 등을 시작하려는 분들, 혹은 하고 계신 분들 중 '집중', '몰입' 하는 것의

중요성과 방법을 알고자 하는 분들께 추천합니다. 특히, 시간적으로 '밀도 있게 해내고 싶다'고 바라시는 분들께 추천합니다.

 

읽게 된 계기:

https://www.youtube.com/watch?v=kICh_d6tHQk&t=443s

 

위 영상에서 나와서 읽게되었습니다. 위 영상은 1년 이상 하루 12시간 이상 공부한 대학생의 이야기입니다. 자신이 그 전에 어땠고, 그러다가 공부해야겠다 싶어서 어떻게 어떻게 하게 되었고 하는 얘기들을 합니다. 그러면서 중간중간 책이나 영상을 추천해주는데, 거기서 나온 책들 중 하나입니다. 영상 속 추천 콘텐츠들 중, 개인적으로 제일 도움되지 않을까(나에게는) 합니다.

(자막이 있으니, 편하게 볼 수 있습니다)

 


 

#Key point 1:  왜 해야하는가?

저자의 주장은 '딥 워크를 해야한다.' (딥 워크는 러프하게 '몰입' 이라고 보시면 됩니다) 입니다. 그러한 주장에 따른 근거들을 이야기합니다.

 

"그러니까 이게 참 좋은데 말이야. 요즘 같은 시대에는 더 중요하고. 그 이유들을 말해줄게. 아, 실리콘밸리의 어떤 거대기업들(e.g. META)은 개방형 사무실이면서 서로 티키타카하면서 일한다고? 몇몇 성공한 사람들은 24시간 소통하면서 일한다고? 그것들에 대해서도 반박해줄게, 다 설명해줄게."

 

위와 같은 느낌입니다.

 

이유1) 지금 시대에 필요한 능력을 기르는데 필요한 요소가 '딥 워크' 이니까

1. 어려운 일을 신속하게 습득하는 능력

2. 질과 속도 면에서 최고 수준의 성과를 올리는 능력

 

위와 같은 능력들이 지금 우리 시대에 필요한 능력들이라고 말하며, 그것을 기르는데에 필수적이기에 필요하다고 말합니다.

 

- 특정한 기술(혹은 영역, 분야)에 지속해서 집중하면(=딥 워크), 그것과 관련된 신경 회로들이 거듭 발화하여 해당 신경 회로와 연계된 기술에 능숙하게 된다.

- '성과 = 투입 시간 X 집중 강도'의 집중 강도를 높이기 위함이다.

- and so on.....

 

이유2) 몰입하는 삶이 최선의 삶이니까

  몰입하는 상태가 오히려 여유로울 때보다 더 좋다고 말하며 그에 따른 근거들을 제시합니다.

저도 동의하는게, 어떤 것에 몰입하면 그것을 중심으로 사고하게 되고, 부정적인 생각들은 찾아오지 않는 것 같습니다.

19, 20세기 이후, 인류에게 생긴 새로운 숙제인 '허무주의'에 대해서도 어떤 것에 몰입하면서 벗어날 수 있는 것 같습니다.

 

  예를 들어, 저의 경우인데, 3D 그래픽스에 대해 관심사가 쏠려 있을 때였습니다. 그냥 밖의 사물들을 보면서도 '아 이런 걸 모델링하려면 점이 이렇게 찍혀서 이런 모습이겠고, 빛은 이렇게 이렇게 되겠구나.. 와 진짜 복잡하겠다. 진짜 현실은 엄청나다.' 이런 생각들을 했습니다. 여유로울 때에는 '도대체 왜 살지, 결국 광활한 우주에서 하나의 매우엄청사소한 유기체 중 하나일 뿐인데....' 이런 생각이 떠오르는 것에 반해 말입니다.

 

#Key point 2:  어떻게 하는가?

다양한 방법들을 소개하고 있습니다. 여러 사람마다 다른 방식을 채택한다는 점과 상황마다 다른 방식을 채택한다는 점을 상기하면서, 다양하게 소개합니다.

 

Ex. 수도승 스타일

도널드 크누스(컴퓨터과학 거장 중 한명, KMP의 그 K)가 수도승 스타일로 소개되고 있습니다. 그는 진짜 연락 수단이 거의 없고(인터넷으로는 불가능) 틀어박혀서 연구하거나 책을 쓰는 방식으로 딥 워크를 합니다.

 

Ex. 루틴 스타일

특별한 동기가 없지만, 무언가를 해내고자 하는 사람들, 혹은 해내야 하는 사람들에게 권해지는 방법입니다. 루틴화하여 꾸준히 하는 것입니다.

 

Ex. 체화 스타일

딥 워크에 숙련되어서, 자투리 시간에도 틈틈히 딥 워크로 전환할 수 있는 사람들에게 권해지는 방법입니다. 사실 사람들과의 연결을 단절할 수 없는 요즘 시대에 보편적으로 사용될 수 있는 방법이라고 생각됩니다. 그러나 이를 채택하기 위해서는 딥 워크로 전환하는 능력이 어느 정도 훈련되어야 합니다.

 

이외에도....

- 분 단위로 스케줄표를 한 번 짜 봐라. 물론 이를 철두철미하게 지키라는 것이 아니다. 언제든지 '아이디어'가 떠오르거나, '번뜩이는 것'이 있어서 (예를 들어 논문에 대한 기발한 진전이 떠오른다거나) 그것에 집중하고자 하면 계획보다 그것을 중요시해라. 스케줄표를 짜는 것의 핵심은 '시간을 소중히 여기게 되는' 것과 주의 전환 비용을 줄이는 것이지. '반드시 지켜야 한다'가 아니다!

 

- 딥 워크 장소와 시간을 정하고, 딥 워크시의 기본 규칙(e.g. 스마트폰을 넣어둔다.), 딥 워크를 잘 할 수 있도록 보조 수단 등을 구축해라.

 

- 일과를 마친 후에는, '다 잊고' 쉬는 것에 집중하라. 괜히 조금 씩이라도 생각하면 온전한 휴식이 되지 못한다.

 

- (저자는 오후 5시 30분을 일과 종료시간으로 잡고 살았다 합니다) 일과 마감시간을 잡아서 좋은 점은, 당연히 적절한 휴식시간을 가질 수 있다는 것이고. 딥 워크로써의 이점은, 오히려 주어진 일과 시간에 대해서 더욱 소중하게 여기고 밀도있게 쓰게 된다는 점이다.

 

#Sub point: email, SNS, ....

저자는 책 속에서 딥 워크 최대의 적으로 'SNS, email...' 같은 internet 콘텐츠들을 경계합니다. 그에 따라 이메일을 처리하는 효율적인 방식들을 제안하고, 사례들을 소개하기도 합니다. 또한 왜 SNS를 하지 않는 것이 좋은지, 해야 될지 말아야 할지 정하는 방법 등을 소개합니다. (해야 되는 사람도 있으니까요)

 

예를 들어, 1. 자신의 개인적 목표에 대해서 생각하고 2. 그것을 이루기 위한 수단들을 생각했을 때,

SNS가 미치는 영향이 부정적인게 더 크면 하지 않는게 좋다고 말합니다. 그리고 대부분의 경우 부정적인게 더 크다고 말하죠.

그러나 사람들은 인터넷과 같은 신기술에 대해서 부정적인 시선보다 긍정적인 면을 더 많이 보려 하고, 긍적적인 면이 조금이라도 있으면 부정적인 면이 더 큰지 고민하지 않고 사용한다고 말합니다.

 


 

읽고 나서..

저에겐 큰 도움이 된 것 같습니다. 일단 스마트폰 사용에 대해서 되돌아 보게 되었고, '피상적 작업' (딥 워크를 하지 않는 작업들) 이 무엇인지, 피상적 작업과 딥 워크의 시간 분배에 대한 이야기가 나오는데 그것 또한 좋은 깨달음을 주었습니다. '아 이러이러한 것들이 피상적 작업이고 이런 작업들은 집중력이 좀 떨어질 때 몰아서 처리해 버려야 겠구나, 진짜 발전은 딥 워크에서 나오는 구나', '단순히 시간을 때려박는다고 될게 아니고, 어떻게 때려박을지, 얼마나 때려박을지, 등에 대해서도 고민해 봐야 하는구나.'

특히, '피상적 작업'이 무엇인지 인지하고 '시간 분배'에 대해 더 생각해 보게 된 점이 좋았습니다.

파일을 받아보면 pcapng 파일이다.

TCP 따라가기를 해보면,

이상하게 반복되는 값들이 나온다.

뭐지.. 하고 고민하다가 일단 문자로 바꿔볼까 하고 바꿔보았다.

print(chr(0x2e))  
print(chr(0x2d))

 

실행결과:

.
-

!! 점(dot, .)과 바(bar, -)였다. 보자마자 모스부호가 바로 생각났다.

그래서 바꿔보니(파이썬 코드로 바꿨다)

morse = list(input().split())  
decode_morse = []  

for m in morse:  
    one_word = []  
    for i in range(0, len(m), 2):  
        tmp = int(m[i] + m[i+1], 16)  
        tmp = chr(tmp)  
        one_word.append(tmp)  
    decode_morse.append(one_word)  

for m in decode_morse:  
    for w in m:  
        print(w, end="")  
    print()

 

실행결과(와이어샤크로 나온 값 입력 값으로 줌):

..
--...
.----.
...
..--.-
--
-----
.-.
...
.
..--.-
-.-.
-----
-..
.
-.-.--

모스 부호 표를 참고하여 해독해보면,

I7'S_M0RSE_C0DE!

 

FLAG: 3S{I7'S_M0RSE_C0DE!}

 

 

P.S)
생각해보니 문제 제목이 '돈돈돈 쓰쓰쓰 돈돈돈'인 것도,
... --- ... = SOS 였던 것이다.

'CTF > 3SCTF2024' 카테고리의 다른 글

3SCTF2024) DUM DUM :P 포렌식 문제  (0) 2024.07.28
3SCTF2024) Find Spade 리버싱 문제  (0) 2024.07.28

파일을 받아보면 dump.bin 파일이 있다.

HxD로 열어보면

여러 파일들이 섞여 있는 듯 하다.

foremost를 사용해 보았다.

 

foremost -t all -i dump.bin

 

해보니,

이런 것 뿐이었고... 플래그가 아니었다.

엥 말이 안되는데 하면서 다시한번 HxD를 봤다.

IEND라는 문자열로 검색하다가 우연히 7z 파일 시그니처를 보았다.

!! 7z도 있네 하면서 저 파일 부분 바이트를 따로 새로 복붙해서 파일을 만들었다.

7z 파일 안에는 txt 파일 여러개가 존재했다.
저 중에서 diye.txt에 플래그가 존재했다.

 

FLAG: 3S{EA5Y_DUMP_F1L3_G00D_:P}

'CTF > 3SCTF2024' 카테고리의 다른 글

3SCTF2024) 돈돈돈 쓰쓰쓰 돈돈돈 MISC문제  (0) 2024.07.28
3SCTF2024) Find Spade 리버싱 문제  (0) 2024.07.28

일단 저 스페이드 문자는 실제로 유니코드 값으로 0x2660이다.
그리고 아래 식들을 보면, 한 줄당 하나의 알파벳의 값을 구할 수 있음을 알 수 있다.
그리고 Flag는 해당 알파벳들을 순서대로 나열하고 아스키 코드값으로 바꾸면 된다는 것을 명시해 놓았다.

그래서 차례대로 알파벳을 계산해 보면(아래 파이썬 코드로 계산시켰다)

i = 1  
cnt = 0  
alphabets = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  

while cnt < 7:  
    if i + 0x25eb == 0x2660:  
        alphabets[0] = i  
        cnt += 1  
    if 0x2674 - i == 0x2660:  
        alphabets[1] = i  
        cnt += 1  
    if 0x26d1 - i == 0x2660:  
        alphabets[2] = i  
        cnt += 1  
    if (i * 0x72) - 0xf10 == 0x2660:  
        alphabets[3] = i  
        cnt += 1  
    if  0x200 * (i >> 1) + 0x1460 == 0x2660:  
        if not alphabets[5]:  
            alphabets[5] = i  
            cnt += 1  
    if 0x75 * (i << 4) - 0x34720 == 0x2660:  
        alphabets[6] = i  
        cnt += 1  
    if (i + 3) ^ 0x2635 == 0x2660:  
        alphabets[8] = i  
        cnt += 1  

    i += 1  

i = 1  
while cnt < 10:  
    if 0x25 * (i - alphabets[1]) + 0x195e == 0x2660:  
        alphabets[4] = i  
        cnt += 1  
    if alphabets[2] + i + 0x258e == 0x2660:  
        alphabets[7] = i  
        cnt += 1  
    if (i ^ alphabets[0]) + 0x2644 == 0x2660:  
        alphabets[9] = i  
        cnt += 1  
    i += 1  

for a in alphabets:  
    print(chr(a), end=" | ")  
    print(a)

 

실행결과 :

u | 117
 | 20
q | 113
x | 120
n | 110
 | 18
x | 120
a | 97
R | 82
i | 105

?? 뭔가 말도 안되는 값들이 나온다. 그리고 이건 플래그가 아니었다.

일단 이건 리버싱 문제니까. 해당 exe파일을 리버싱해보았다. (기드라로 열었다)

int __cdecl _main(int _Argc,char **_Argv,char **_Env)

{
  HANDLE pvVar1;
  WCHAR local_96 [15];
  int local_78 [25];
  int local_14;
  int *local_c;

  local_c = &_Argc;
  ___main();
  _setlocale(0,"");
  local_78[0] = 0x1080;
  local_78[1] = 0x2a00;
  local_78[2] = 0x2900;
  local_78[3] = 0x2c80;
  local_78[4] = 0x2f80;
  local_78[5] = 0x2c00;
  local_78[6] = 0x1800;
  local_78[7] = 0x2900;
  local_78[8] = 0x2f80;
  local_78[9] = 0x1800;
  local_78[10] = 0x3c00;
  local_78[11] = 0x1900;
  local_78[12] = 0x1b80;
  local_78[13] = 0x1080;
  local_78[14] = 0;
  for (local_14 = 0; local_14 < 0xf; local_14 = local_14 + 1) {
    local_96[local_14] = (WCHAR)(local_78[local_14] >> 7);
  }
  pvVar1 = _CreateMutexW@12((LPSECURITY_ATTRIBUTES)0x0,0,local_96);
  if (pvVar1 != (HANDLE)0x0) {
    _wprintf(L"[+] ♠ == UNICODE(0x2660)\n\n");
    _wprintf(L"[?] A + 0x25eb == ♠\n");
    _wprintf(L"[?] 0x2674 - B == ♠\n");
    _wprintf(L"[?] 0x26d1 - C == ♠\n");
    _wprintf(L"[?] (D * 0x72) - 0xf10 == ♠\n");
    _wprintf(L"[?] 0x25 * (E - B) + 0x195e  == ♠\n");
    _wprintf(L"[?] 0x200 * (F >> 1) + 0x1460 == ♠\n");
    _wprintf(L"[?] 0x75 * (G << 4) - 0x34720 == ♠\n");
    _wprintf(L"[?] C + H + 0x258e == ♠\n");
    _wprintf(L"[?] (I + 3) ^ 0x2635 == ♠\n");
    _wprintf(L"[?] (J ^ A) + 0x2644  == ♠\n\n");
    _wprintf(L"[+] Flag: 3S{ASCII(ABCDEFGHIJ)}\n\n");
    _system("pause");
  }
  return (uint)(pvVar1 == (HANDLE)0x0);
}

보면 local_78 이라는 배열에 특정 값들을 담고 local_96에 변환하여 넣어준다. 그래서 해당 값들을 한번 출력해 보았다. (거의 걍 복붙하고 local_96만 출력해 본 것)

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

#define WCHAR wchar_t

int main()
{
  WCHAR local_96 [15];
  int local_78 [25];
  int local_14;
  int *local_c;


  local_78[0] = 0x1080;
  local_78[1] = 0x2a00;
  local_78[2] = 0x2900;
  local_78[3] = 0x2c80;
  local_78[4] = 0x2f80;
  local_78[5] = 0x2c00;
  local_78[6] = 0x1800;
  local_78[7] = 0x2900;
  local_78[8] = 0x2f80;
  local_78[9] = 0x1800;
  local_78[10] = 0x3c00;
  local_78[11] = 0x1900;
  local_78[12] = 0x1b80;
  local_78[13] = 0x1080;
  local_78[14] = 0;
  for (local_14 = 0; local_14 < 0xf; local_14 = local_14 + 1) {
    local_96[local_14] = (WCHAR)(local_78[local_14] >> 7);
  }

  for(int i=0;i<0xf;i++) {
    wprintf(L"%c", local_96[i]);
  }

  return 0;
}

 

출력해 보면,

 

? 0x27로 XOR 연산을 해보라고 한다!!!

그래서 아까 짰던 파이썬 코드 부분에서 마지막에 XOR 연산만 추가해서 출력하면,

for a in alphabets:  
    print(chr(a ^ 0x27), end=" | ")  
    print(a)

 

결과:

R | 117
3 | 20
V | 113
_ | 120
I | 110
5 | 18
_ | 120
F | 97
u | 82
N | 105

 

FLAG : 3S{R3V_I5_FuN}

'CTF > 3SCTF2024' 카테고리의 다른 글

3SCTF2024) 돈돈돈 쓰쓰쓰 돈돈돈 MISC문제  (0) 2024.07.28
3SCTF2024) DUM DUM :P 포렌식 문제  (0) 2024.07.28

서로 다른 2개의 연관된 데이터를 하나의 데이터로 묶어서 관리할 수 있게 해주는 STL.

data1 data2

한 pair가 저렇게 생겼다.
다양한 방면에서 사용할 수 있다. 대표적으론 다음과 같다.

  • 인덱스와 그 인덱스에 해당하는 데이터를 따로 저장해야 할 경우
  • 좌표를 저장해야 할 경우
  • 키 값과, 비교해야하는 값(우선순위가 있는 값) 쌍일 경우 등

사용 방법

헤더 파일

<utility>라는 헤더 파일에 있는데, 사실 이 헤더 파일은 <vector> 혹은, <algorithm> 에 포함되어 있다.

#include <utility>
#include <vector>
#include <algorithm>

3 가지 헤더 파일 중 하나라도 있으면 사용이 가능하다.

선언
pair<type1, type2> p;

type1, type2에는 저장할 데이터의 자료형을 적어주면 된다.
둘이 같아도 무방하다.

메소드

p는 pair 변수라 가정한다.

  • p.first // 첫 번째 페이 데이터에 접근
  • p.second // 두 번째 페어 데이터에 접근
  • make_pair
활용 예

pair는 다른 STL들이나, 인자 등으로 활용이 가능하다.

queue<pair<int, int>> Q;
...
Q.push({0, 0});
...
pair<int, int> cur = Q.front();
int compare(pair<int, int> n1, pair<int, int> n2) {
...
}

'Some Practices > 바킹독 실전 알고리즘 강좌 수강' 카테고리의 다른 글

Deque STL  (0) 2024.07.18
Queue STL  (0) 2024.07.17
Stack STL  (0) 2024.07.17
List STL  (0) 2024.07.11
실수 자료형의 주의점  (0) 2024.07.11

타입을 반환하거나.. 변환하거나... 한 타입에서 다른 타입으로 값이 옮겨지는 과정의 논리적 취약점이다.

예를 들면)

  • int로 값을 입력받아 특정 함수에 넘겨준다.
  • 해당 함수에서 어떠한 검사 과정을 거쳐, int형으로 값을 반환한다.
  • 반환 받는 변수가 unsigned short형이다.

위 과정에서 int -> unsigned short로 바뀌면서 소실이 일어난다.

해당하는 CTF 문제 하나를 예시로 마무리하겠다.

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

#define MAX_ID_LEN 10
#define USERS_COUNT 5
char account_id[USERS_COUNT][MAX_ID_LEN] = { "james", "sarah", "gildong", "asdf1234", "admin" };

int get_lower_than(int idx) {
    int input;
    scanf("%d", &input);
    if(input >= idx) {
        puts("NO ACCOUNT FOUND");
        exit(1);
    }
    return input;
}

int main() {
    printf("HI, Logging in as?: ");
    fflush(stdout);
    unsigned short idx = get_lower_than(USERS_COUNT - 1);
    printf("Welcome, %s\n", account_id[idx]);
    fflush(stdout);
    if(strncmp(account_id[idx], "admin", 5) == 0) {
        printf("________SYSTEM SETTINGS________\n");
        fflush(stdout);
        system("/bin/sh");
    } else {
        system("/bin/date");
    }
}

목표는 main함수의 system("/bin/sh")를 실행시키는 것.
그러려면 해당하는 if문을 통과해야 한다.

account_id[idx]와 admin 이라는 문자열을 비교하는데, account_id[4]에 admin 문자열이 존재한다.
따라서 idx가 4가 되도록하면 풀리는 문제이다.

idx는

unsigned short idx = get_lower_than(USERS_COUNT - 1);

으로부터 온다. USERS_COUNT는 5로 전처리 되어있다. 여튼 저기서 주는 값이 idx를 4로 만들도록 하면 되겠다.

int get_lower_than(int idx) {
    int input;
    scanf("%d", &input);
    if(input >= idx) {
        puts("NO ACCOUNT FOUND");
        exit(1);
    }
    return input;
}

입력하는 값은 int형.. 반환하여 도착하는 변수인 idx의 타입은 unsigned short..
int가 더 크니까 언더플로우로 유도하면 되겠다.

위 함수의 idx는 4로 고정되어 있다. if문을 그냥 지나가야 return을 한다. 따라서 우리가 입력하는 값의 조건은 다음과 같다.

  • 4보다 작아야 한다.
  • int -> unsigned short가 되면서 결국 4가 되어야 한다.

-65532를 입력하면 쉘을 얻을 수 있다!

'Hacking > Pwnable' 카테고리의 다른 글

RTL and ROP  (0) 2024.07.14
원하는 주소로 return 시키기  (0) 2024.07.12

덱 STL 사용법.

사용 방법

헤더 파일
#include <deque>
선언
deque<type> variable_name;

type에 원하는 타입 적고, 변수명을 적어주면 된다.

메소드

D는 deque 변수라 가정한다.

  • D.push_front(data)
  • D.push_back(data)
  • D.size()
  • D.empty()
  • D.pop_front()
  • D.pop_back()
  • D.front()
  • D.back()
  • D.begin()
  • D.end()
  • D.clear()
  • D.insert(address) // ex) D.insert(D.begin() + 1)
  • D.erase(address) // ex) D.erase(D.begin() + 3)
순회
for(auto x : D) cout << x << ' ';
특징
  • 앞, 뒤에서 삽입 및 삭제가 가능하다.
  • 맨 앞, 맨 뒤에서의 작업은 O(1)이다.
  • 원래는 안되지만 STL Deque은 인덱스처럼 참조가 된다.
  • 마치 vector 같지만 차이가 있긴 하다(연속된 메모리 저장이 아니라던가..)

'Some Practices > 바킹독 실전 알고리즘 강좌 수강' 카테고리의 다른 글

Pair STL  (0) 2024.07.22
Queue STL  (0) 2024.07.17
Stack STL  (0) 2024.07.17
List STL  (0) 2024.07.11
실수 자료형의 주의점  (0) 2024.07.11

위키문서 : https://en.wikipedia.org/wiki/Foremost_(software)

참고자료 : https://m.blog.naver.com/koromoon/220553895618

 

포렌식 CTF 문제에서 사용할 수 있는 툴입니다.

어떤 파일 안의 다른 파일이 숨겨져 있을 경우, 추출해줍니다.

예를 들면

  • ELF 시그니쳐로 시작하는 파일 속에, PNG 시그니처, JPEG 시그니처 등이 보여서 안에 다른 파일이 숨겨진 듯 할 때
  • 파일 용량이 뭔가 이상하게 클 때(파일의 형식에 비해)

등, 이 툴을 이용해 문제를 해결할 수 있습니다.

 

사용 방법은 foremost -h를 치면 쭈루룩 나오긴 합니다.

$ foremost [-v|-V|-h|-T|-Q|-q|-a|-w-d] [-t <type>] [-s <blocks>] [-k <size>]
        [-b <size>] [-c <file>] [-o <dir>] [-i <file]

-V  - display copyright information and exit
-t  - specify file type.  (-t jpeg,pdf ...)
-d  - turn on indirect block detection (for UNIX file-systems)
-i  - specify input file (default is stdin)
-a  - Write all headers, perform no error detection (corrupted files)
-w  - Only write the audit file, do not write any detected files to the disk
-o  - set output directory (defaults to output)
-c  - set configuration file to use (defaults to foremost.conf)
-q  - enables quick mode. Search are performed on 512 byte boundaries.
-Q  - enables quiet mode. Suppress output messages.
-v  - verbose mode. Logs all messages to screen

 

설치 :

$ sudo apt-get install foremost

 

 

사용 예시)

파일 안에 2개 이상의 파일 시그니처가 있다, 용량도 매우 크고..

foremost -t all -i img1

명령어 사용 - img1 파일에서 모든 파일 추출하기

png 파일이 추출된 모습!

리스트, 스택에 이어 큐도 STL에 당연히 있다.

사용 방법

헤더 파일
#include <queue>
선언
queue<type> variable_name;

type에 원하는 타입(int, char ...)을 적어주면 된다.

메소드

Q는 queue 변수라 가정한다.

  • Q.push(data)
  • Q.size()
  • Q.empty()
  • Q.pop()
  • Q.front()
  • Q.back()

주의할 점: front와 back, pop은 비어있는데 사용하면 런타임 에러가 발생한다.

특징
  • back으로 삽입, front에서 제거가 이루어지고 시간복잡도는 O(1)이다. (FIFO)
  • 인덱스로 참조 불가능하다.

'Some Practices > 바킹독 실전 알고리즘 강좌 수강' 카테고리의 다른 글

Pair STL  (0) 2024.07.22
Deque STL  (0) 2024.07.18
Stack STL  (0) 2024.07.17
List STL  (0) 2024.07.11
실수 자료형의 주의점  (0) 2024.07.11

C++ STL에 구현되어 있는 stack ADT를 사용하는 방법을 알아보자.

사용 방법

선언
stack<type> variable_name;
메소드
stack<int> S;

S.push(10);
S.push(11);
...

S.size() // return size of stack

S.empty() // if stack is empty, return true (else false)

S.pop() // delete top data at stack

S.top() // just return top of stack

S는 스택 변수, int 형 이라고 가정한다.

  • S.push(data)
  • S.size()
  • S.empty()
  • S.pop()
  • S.top()

주의할 점: pop과 top은 stack이 비어 있을 때 사용하면 런타임 에러!
주의할 점2: pop은 삭제만 하고 값을 리턴하진 않는다!!

'Some Practices > 바킹독 실전 알고리즘 강좌 수강' 카테고리의 다른 글

Pair STL  (0) 2024.07.22
Deque STL  (0) 2024.07.18
Queue STL  (0) 2024.07.17
List STL  (0) 2024.07.11
실수 자료형의 주의점  (0) 2024.07.11

+ Recent posts