암스트롱수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main(){
    int n,m,i,copy,sum;
    scanf("%d %d",&n,&m);
    for(i=n; i<=m; i++){
        copy=i;
        sum=0;
        while(copy>0){
            sum+=(copy%10)*(copy%10)*(copy%10);
            copy= copy/10;
        }
        if(sum==i)
            printf("%d ",i);
    }
 
    return 0;
}
cs



최단거리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
int main(){
    int n,*arr,min,i;
    scanf("%d",&n);
    arr =(int*)malloc(sizeof(int)*n);
    for(i=0; i<n; i++){
        scanf("%d",arr+i);
    }
    min = arr[1- arr[0];
    for(i=2; i<n; i++){
        if(arr[i] - arr[i-1< min){
            min = arr[i] - arr[i-1];
        }
    }
    printf("%d",min);
    return 0;
 
}
cs



레고블럭

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
 
int main(){
    int n, *arr, max, i, cnt=1;
    scanf("%d",&n);
    arr = (int*)malloc(sizeof(int)*n);
    for(i=0; i<n; i++){
        scanf("%d", arr+i);
    }
    max = arr[0]; //max는 앞에 보이는 블럭의 높이
    for(i=1; i<n; i++){ //블럭을 좌>우로 순회 (왼쪽이 앞)
        if(arr[i] > max){ //앞에 보이는 블럭보다 뒤에 블럭이 더 크면
            max = arr[i]; //max를 바꿔줌
            cnt++//보이는 블록수 +1
        }
    }
    printf("%d " ,cnt); //왼쪽에서 봤을 때 블록 수
    cnt = 1;
    max = arr[n-1];
    for(i=n-2; i>=0; i--){ //블럭을 우>좌로 순회(오른쪽이 앞)
        if(arr[i] > max){
            max = arr[i];
            cnt++;
        }
    }
    printf("%d", cnt);
    return 0;
}
cs


'동아리' 카테고리의 다른 글

C언어 암스트롱수,최단거리,레고블럭  (0) 2018.12.06

쉘 스크립트 이용해서 간단한 게임을 만들어 봤다.

이해 쉽게 주석 달아 놨음


자세한건 : https://github.com/realsung/Shell_Game


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
hhs#!/bin/bash
 
function main_print(){ # 메인 옵션들 출력
    echo "◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎"
    echo "=                                                 ="
    echo -"\033[1;31m=                  1. 겜 시작                     ="
    echo -"\033[1;33m\033[0m""=                                                 ="
    echo -"\033[1;31m=                  2. 도움말                      ="
    echo -"\033[1;33m\033[0m""=                                                 ="
    echo -"\033[1;31m=                  3. 종료                        ="
    echo -"\033[1;33m\033[0m""=                                                 ="
    echo -"\033[1;36m=  About : https://github.com/realsung/Shell_Game ="
    echo -"\033[1;33m\033[0m""=                                                 ="
    echo -"◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎-◎"
}
 
function menu(){ # 게임 메뉴들
    echo "[0] 뒤로가기"
    echo "[1] 숫자 맞추기 게임"
    echo "[?] 업데이트 예정..."
}
 
function game1(){ # 1. 숫자 맞추기 게임
    echo "숫자 맞추기 게임"
    echo "1 ~ 100 사이의 숫자를 입력 해주세요"
    rand=$(( ( $RANDOM % 100 ) + 1 )) # 랜덤 함수 사용해서 100까지 숫자중 랜덤 숫자 하나 지정
    for((i=0; i<=7; i++)); # 8번 반복
    do
        echo -"\033[1;32m" # [*] Input 초록색 지정 
        printf "[*] Input : "
        read game1_input # 입력
        echo -"\033[1;33m\033[0m" #나머지는 일반 색
        if [ ${rand} -eq ${game1_input} ]; then # 랜덤 값과 내가 입력한 값이 같으면 
            echo "You got it!!" # 잘했음
            break ;
        else
            if [ ${rand} -gt ${game1_input} ]; then # 내가 입력한 값이 랜덤 값보다 작으면
                echo "더 높은 수를 입력하세요"
            elif [ ${rand} -lt ${game1_input} ]; then # 내가 입력한 값이 랜덤 값보다 크면
                echo "더 낮은 수를 입력하세요"
            fi
        fi
    done
    sleep 2s
    echo ""
}
 
function helpme(){ # 도움말
    echo "[*] 게임 시작을 눌렀을 때 "
    sleep 1s
    echo "1. 숫자 맞추기 게임"
    sleep 1s
    echo "랜덤으로 숫자가 나옵니다."
    sleep 1s
    echo "당신은 8번의 기회가 있습니다"
    sleep 1s
    echo "1~100까지의 숫자 중에 하나를 맞추면 되는 게임입니다."
    sleep 3s
    echo ""
}
 
function end(){ # 종료
    echo "정말 종료할거야? ㅠ "
    sleep 0.5s
    echo "1. 종료"
    sleep 0.5s
    echo "2. 아니야"
    echo -"\033[1;31m" # [*] Input 빨강색 지정 
    printf "[*] Input : "
    read exit 
    echo -"\033[1;33m\033[0m" #나머지는 일반 색
    if [ ${exit} -eq 1 ]; then # 1 누르면 종료
        echo "Bye Bye ~"
        exit 0
    elif [ ${exit} -eq 2 ]; then #2 누르면 뒤로가기
        continue ;
    else
        echo "입력 값이 잘못됨"
    fi
    echo ""
}
 
while :
do
    main_print # 1,2,3 옵션 있는 거 출력
    echo -"\033[1;32m" # [*] Input 초록색 지정 
    printf "[*] Input : "
    read input # 입력
    echo -"\033[1;33m\033[0m" #나머지는 일반 색
    if [ ${input} -eq 1 ]; then #1번 눌렀을 때 game1 함수 실행
        menu # 메뉴함수 호출
        echo -"\033[1;32m" # [*] Input 초롤색 지정 
        printf "[*] Input : "
        read memu_num # 입력
        echo -"\033[1;33m\033[0m" #나머지는 일반 색
        if [ ${memu_num} -eq 0 ]; then # 메뉴 번호 = 0 뒤로가기
            echo ""
            continue ;
        elif [ ${memu_num} -eq 1 ]; then # 메뉴번호 = 1 숫자맞추기 게임
            game1
        else 
            echo "입력 값이 잘못됨"
            echo ""
        fi
    elif [ ${input} -eq 2 ]; then #2번 눌렀을 때 도움말들 
        helpme # 도움말 함수 호출
    elif [ ${input} -eq 3 ]; then #3번 눌렀을 때 종료 옵션
        end # 종료 함수 호출
    else
        echo "1,2,3중에 하나만 고르세요"
    fi
done
 



'ShellScript' 카테고리의 다른 글

Shell Script Game v1.0  (0) 2018.12.02
Shell Script 정리  (0) 2018.12.02

Shell Script

#!/bin/sh
#!/bin/bash
#!/bin/zsh

#으로 시작하면 주석인데 # 바로 뒤에 ! 가 오면 스크립트를 실행할 쉘을 지정하는 선언문이다.

주석

# example it's comment!

맨 앞글자에 # 을 붙여주면 된다.

출력

#!/bin/bash
echo "My name is Sung"
printf "Hello World!"

echo

문장을 출력해주는데 python의 print()처럼 자동 줄바꿈이 된다. 변수 출력시에는 앞에 $ 을 붙여준다.

printf

C언어와 매우 유사하다. 줄 바꿈이 안 된다.

변수

#!/bin/bash
var1="Apple"
var2="Strawberry"

fuction f(){
local var3="it's Local variable"
echo $var3
}
echo $var1 $var2
printf "local variable : "
f

변수를 사용하려면 앞 뒤 공백 없이 = 를 입력하면 대입연산자가 된다.

그리고 그냥 선언한 변수는 전역 변수가 된다. 함수 안에서 지역변수를 사용하려면 변수 이름 앞에 local을 붙여주면 된다.

함수

#!/bin/bash
function test1(){
   echo "It's test1"
}
test2(){
echo "It's test2"
}
test1
test2

함수를 선언할 때 function을 붙여도 되고 안붙여도 상관 없다.

단, 함수 명을 쓰면 함수가 호출이 되는데 호출 코드가 함수 코드보다 반드시 에 있어야 된다. 함수 코드 보다 앞에서 호출 시 오류가 발생한다.

배열

#!/bin/bash
arr=('a' 'b' 'c' 'd')

arr[4]='test'
echo ${arr[4]}

arr[5]='input'
echo ${arr[5]}

echo ${arr[@]}

unset arr
echo ${arr[@]}

배열 사용시에는 괄호를 사용해야한다.

기존 배열에 값을 추가할 수 있고 바꿀 수도 있다.

특정 배열의 함수를 보고싶으면 arr[@] 또는 arr[*]을 사용한다. unset을 이용하면 배열을 지울 수 있다.

참고로 1차원 배열밖에 사용하지 못 한다.

조건문

#!/bin/bash
var1=10
var2=11
if [ ${var1} -eq ${var2} ]; then
echo "var1 Equal var2"
elif [ ${var1} -ne ${var2} ]; then
echo "var1 Not Equal var2"
fi

if문의 기본 형태는 아래와 같다.

값 조건식 값을 넣을 때 띄어쓰기가 안 들어가면 스크립트 에러가 난다.

if

[ 값 조건식 값 ]; then

~~~

fi

조건식설명
-z문자열의 길이가 0이면 참
-n문자열의 길이가 0이 아니면 참
-eq값이 같으면 참
-ne값이 다르면 참
-gt값1 > 값2
-ge값1 >= 값2
-lt값1 < 값2
-le값1 <= 값2
-a&& , And연산과 동일
-o|| , xor 연산과 동일

선택문

#!/bin/bash
echo "Enter a Num between 1 to 5"
read num
case $num in
1) echo "You pick Number 1" ;;
2) echo "You pick Number 2" ;;
3) echo "You pick Number 3" ;;
4) echo "You pick Number 4" ;;
5) echo "You pick Number 5" ;;
*) echo "Invalid Number" ;;
esac

문장 끝은 ;; 으로 끝내준다. 그리고 case에 없는 값은 *) 을 사용해서 예외 할 수 있다.

반복문

반복문을 빠져 나갈 때 braek 를 사용하고 반복문이나 조건문을 건너 뛸 때는 `continue를 사용한다.

#!/bin/bash
for i in {1..5..2}
do
echo ${i}
done

count=5

for((i=1; i<=count; i++)); do
printf ${i}" "
done

echo ""

i=0
while [ $i -le 5 ]
do
   echo $i
    i=$(($i+1))
done

for문은 아래와 같은 형식으로 이루어져 있다.

for [변수] in [반복 조건]
do
  [실행문]
done

while문은 아래와 같은 형식으로 이루어져있다.

while [ 값1 조건식 값2 ]
do
  [실행문]
  [실행문]
done

변수 타입

#!/bin/bash
declare -r str_var="Hello"
declare -i num_var=9999
declare -a arr_var=(1 4 'NOP' 10)
declare -x exp_var="export"

func(){
echo "fuction..."
}

declare -f func

echo ${str_var} ${num_var} ${arr_var[*]} ${exp_var}

변수는 타입을 구분하지 않고 기본적으로 문자열이다. 단 문맥에 따라 연산 처리를 한다.

그래서 변수 타입을 지정하기 위해서 declare , typeset 타입 지정 명령을 지원한다. 옵션은 같다.

-r은 읽기전용 -i는 정수 -a는 배열 -x는 환경 변수 -f는현재 스크립트의 함수 출력을 해준다.

예약 변수

문자설명
HOME사용자의 홈 디렉토리
PATH실행 파일을 찾을 경로
LANG프로그램 사용시 기본 지원되는 언어
PWD사용자의 현재 작업중인 디렉토리
FUNCNAME현재 함수 이름
SECONDS스크립트가 실행된 초 단위 시간
SHLVL쉘 레벨(중첩된 깊이를 나타냄)
SHELL로그인해서 사용하는 쉘
PPID부모 프로세스의 PID
BASHBASH 실행 파일 경로
BASH_ENV스크립트 실행시 BASH 시작 파일을 읽을 위치 변수
BASH_VERSION설치된 BASH 버전
BASH_VERSINFOBASH_VERSINFO[0]~BASH_VERSINFO[5]배열로 상세정보 제공
MAIL메일 보관 경로
MAILCHECK메일 확인 시간
OSTYPE운영체제 종류
TERM로긴 터미널 타입
HOSTNAME호스트 이름
HOSTTYPE시스템 하드웨어 종류
MACHTYPE머신 종류(HOSTTYPE과 같은 정보지만 조금더 상세하게 표시됨)
LOGNAME로그인 이름
UID사용자 UID
EUIDsu 명령에서 사용하는 사용자의 유효 아이디 값(UIDEUID 값은 다를 수 있음)
USER사용자의 이름
USERNAME사용자 이름
GROUPS사용자 그룹(/etc/passwd 값을 출력)
HISTFILEhistory 파일 경로
HISTFILESIZEhistory 파일 크기
HISTSIZEhistory 저장되는 개수
HISTCONTROL중복되는 명령에 대한 기록 유무
DISPLAYX 디스플레이 이름
IFS입력 필드 구분자(기본값: - 빈칸)
VISUALVISUAL 편집기 이름
EDITOR기본 편집기 이름
COLUMNS현재 터미널이나 윈도우 터미널의 컬럼 수
LINES터미널의 라인 수
LS_COLORSls 명령의 색상 관련 옵션
PS1기본 프롬프트 변수(기본값: bash\$)
PS2보조 프롬프트 변수(기본값: >), 명령을 ""를 사용하여 명령 행을 연장시 사용됨
PS3쉘 스크립트에서 select 사용시 프롬프트 변수(기본값: #?)
PS4쉘 스크립트 디버깅 모드의 프롬프트 변수(기본값: +)
TMOUT0이면 제한이 없으며 time시간 지정시 지정한 시간 이후 로그아웃

위치 매개 변수

문자설명
$0실행된 스크립트 이름
$1$1 $2 $3...${10}인자 순서대로 번호가 부여된다. 10번째부터는 "{}"감싸줘야 함
$*전체 인자 값
$@전체 인자 값($* 동일하지만 쌍따옴표로 변수를 감싸면 다른 결과 나옴)
$#매개 변수의 총 개수

특수 매개 변수

문자설명
$$현재 스크립트의 PID
$?최근에 실행된 명령어, 함수, 스크립트 자식의 종료 상태
$!최근에 실행한 백그라운드(비동기) 명령의 PID
$-현재 옵션 플래그
$_지난 명령의 마지막 인자로 설정된 특수 변수

매개 변수 확장

문자설명
${변수}$변수와 동일하지만 {} 사용해야만 동작하는 것들이 있음
${변수:위치}위치 다음부터 문자열 추출
${변수:위치:길이}위치 다음부터 지정한 길이 만큼의 문자열 추출
${변수:-단어}변수 미선언 혹은 NULL일때 기본값 지정, 위치 매개 변수는 사용 불가
${변수-단어}변수 미선언시만 기본값 지정, 위치 매개 변수는 사용 불가
${변수:=단어}변수 미선언 혹은 NULL일때 기본값 지정, 위치 매개 변수 사용 가능
${변수=단어}변수 미선언시만 기본값 지정, 위치 매개 변수 사용 가능
${변수:?단어}변수 미선언 혹은 NULL일때 단어 출력 후 스크립트 종료
${변수?단어}변수 미선언시만 단어 출력 후 스크립트 종료
${변수:+단어}변수 선언시만 단어 사용
${변수+단어}변수 선언 혹은 NULL일때 단어 사용
${#변수}문자열 길이
${변수#단어}변수의 앞부분부터 짧게 일치한 단어 삭제
${변수##단어}변수의 앞부분부터 길게 일치한 단어 삭제
${변수%단어}변수의 뒷부분부터 짧게 일치한 단어 삭제
${변수%%단어}변수의 뒷부분부터 길게 일치한 단어 삭제
${변수/찾는단어/변경단어}처음 일치한 단어를 변경
${변수//찾는단어/변경단어}일치하는 모든 단어를 변경
${변수/#찾는단어/변경단어}앞부분이 일치하면 변경
${변수/%찾는단어/변경단어}뒷부분이 일치하면 변경
${!단어*}, ${!단어@}선언된 변수중에서 단어가 포함된 변수 명 추출(

비트 연산자

문자설명
<<비트 왼쪽 쉬프트(쉬프트 한 번당 2를 곱하는 것과 동일함)
<<=left-shift-equal
>>비트 오른쪽 쉬프트(쉬프트 한 번당 2로 나눔)
>>=right-shift-equal(<<=와 반대)
&비트 and
&=비트 and-equal
|비트 OR
|=비트 OR-equa
~비트 negate
!비트 NOT
^비트 XOR
^=비트 XOR-equal

기타 연산자

문자설명
,콤마 연산자(comma operator), 2개 이상의 산술 연산을 묶어줌

정수 비교

문자설명
-eq같음
-ne같지 않음
>, -gt더 큼(> 이중 소괄호에서 사용 가능)
>=, -ge더크거나 같음(>= 이중 소괄호에서 사용 가능)
<, -lt더 작음(< 이중 소괄호에서 사용 가능)
<=, -le더 작거나 같음(<= 이중 소괄호에서 사용 가능)

문자열 비교

문자설명
=, ==같음
!=같지 않음
<ASCII 알파벳 순서에 더 작음
>ASCII 알파벳 순서에서 더 큼
-z문자열이 NULL, 길이가 0인 경우
-n문자열이 NULL이 아님
${변수}문자열이 NULL이 아님

'ShellScript' 카테고리의 다른 글

Shell Script Game v1.0  (0) 2018.12.02
Shell Script 정리  (0) 2018.12.02

Volatility 명령어

vol.py -f [덤프뜰 파일] --profile=[프로파일] (플러그인)

 

Plugins

 

Image Identification : 덤프 파일의 하드웨어 정보

- imageinfo, kdbgscan, kprcscan

 

 


 

Processes and DLLs : 프로세스 분석 및 DLL 분석

- pslist, pstree, psscan, dlllist, dlldump, handles, getsids, verinfo, enumfunc

 

 


 

Process Memory : 프로세스 메모리 분석

- memmap, memdump, procmemdump, dumpfiles, procexedump, vadwalk, vadtree, vadinfo, vaddump

 

memdump

특정 프로세스 PID값을 넣어 그 프로세스 추출 가능

vol.py -f [덤프뜰 파일] --profile=[프로파일] memdump -p [PID] -D [디렉토리]

 

dumpfiles

메모리상에 있는 파일 복구

vol.py -f [덤프뜰 파일] --profile=[프로파일] dumpfiles -Q [메모리주소] -D [디렉토리]

 

 


 

Kernel Memory and Objects : 커널 분석

- modules, modscan, moddump, ssdt, driverscan, filescan, mutantscan, symlinkscan, thrdscan

 

filescan

메모리상에 로드된 모든 파일을 볼 수있다.

 

envars

환경변수 보기

 


 

Networking : 네트워크 분석

- connections, connscan, Sockets, sockscan, netscan

 

connections

네트워크 접속 관련 정보

 

 


 

Registry : 레지스트리 분석

- hivescan, hivelist, printkey, hivedump, hashdump, lsadump, userassist

 

 


 

Crash Dumps, Hibernation, and Conversion : 덤프 분석

- crashinfo, , hibinfo, imagecopy

 

 


 

Malware and Rootkits : 악성코드 및 루트킷 분석

- malfind, , svcscan, ldrmodules, impscan, apihooks, idt, gdt, threads, callbacks, driverirp, devicetree, psxview, ssdt_ex, timers

 

malfind

시그니처 패턴 정보

 

 


 

Miscellaneous : 스트링 분석

- strings, volshell, bioskbd, yarascan, iehistory, mftparser

 

iehistory

인터넷 히스토리

 

mftparser

메모리에 로드된 디코딩 자료들 분석

 

 


 

참고 : https://code.google.com/archive/p/volatility/wikis/CommandReference23.wiki

 

 

'Hacking' 카테고리의 다른 글

[2016codegate]Watermelon  (0) 2019.11.13
ARM Reversing  (0) 2019.08.04
메모리 보호기법 해제  (0) 2018.12.19
Volatility Commands  (0) 2018.12.02
메모리포렌식 Volatility  (0) 2018.10.09
PNG 구조  (0) 2018.10.09

Python z3 Module

더 추가할 예정!

z3에 대해 공부할겸 올려봅니다.. ㅎ 틀린부분이나 팁?그런거 있으면 알려주세요

모듈 링크 : https://github.com/Z3Prover/z3

유용한 외국 문서 : https://ericpony.github.io/z3py-tutorial/guide-examples.htm

일반적으로 그냥 근의 공식을 사용해서 프로그래밍을 해서 방정식의 근을 구하는 것은 imperative programming 방식이다.

파이썬의 z3 SMT solver 모듈을 사용해서 방정식의 근을 구하는 것은 decalarative programming이다.

나는 SMT solver 모듈을 사용하는 법에 대해 간단하게 공부하면서 포스팅하겠돠..

SMT solver?

Satisfiability Modulo Theories의 약자이다.

수식을 만족하는 값이 존재하는지 찾아준다. 수식을 만족하는 값이 존재할 경우 그 값을 구해준다.

True or False + 방정식, 부등식 해 구하기

Function

from z3 import *

z3 모듈 사용하기 위해 임포트

x = Int('x')
y = Int('y')

Int()는 미지수(정수)를 선언

x = Real('x')
y = Real('y')

Real()은 미지수(실수)를 선언

x = BitVec('x',8)
y = BitVec('y',8)

BitVec() 미지수(비트 벡터)를 선언

비트 연산을 할 때 사용되는데 BitVec('미지수',n)으로 n비트 미지수를 선언 해준다.

set_option(precision=3)

Real()을 사용했을 때 3자리 까지만 출력하고 싶다면 set_option 함수 사용

s = Solver()

Solver 객체 생성하는 함수

https://z3prover.github.io/api/html/classz3py_1_1_solver.html

위에 Solver()에 대해 많은 예제와 함수들이 있습니다.

s.add()

s.append() 

s.assert_exprs()

s.Insert()

수식을 추가하는 함수

s.assertions()

추가된 수식을 반환하는 함수

s.push()

s.pop()

수식을 넣고 빼는 함수

s.check()

값이 존재하면 sat 값이 존재하지 않으면 unsat을 반환

s.model()

값이 존재할 경우 값을 구해주는 함수

unsat , unknown이면 에러를 반환

s.reason_unknown()

check() 함수의 반환 값이 unknown인 이유를 알려줌

s.reset()

추가한 수식을 초기화 시키는 함수

Example

from z3 import *
x = Int('x')
s = Solver()
s.insert(x*x-4*x+3==0)
print s.check()
print s.model()

x^2 - 4x +3 =0을 풀어주는 예시다.

'Python' 카테고리의 다른 글

python struct module  (0) 2019.11.21
파이썬 리스트의 문자열을 int 형태로 변환  (2) 2019.02.18
Python z3 모듈  (0) 2018.12.02
layout: post
title: 2018 Pico CTF Writeup
date: 2018-10-25
mathjax: true
tag: [picoCTFWriteup]
categories: 0x02_Writeups

2018 PicoCTF WriteUp

NickName : ind3x

TeamName : sunrin

Score : 16785

Forensics Warmup 1 - Point : 50 [Forensics]

압축 파일을 받고 열어보니 flag.jpg파일이 있었다.

Flag : picoCTF{Welcome_to_forensics}

Forensics Warmup 2 - Point : 50 [Forensics]

png 파일을 받았는데 flag.png에 flag가 적혀있었다.

Flag : picoCTF{extensions_are_a_lie}

General Warmup 1 - Point : 50 [General Skills]

16진법 0x61을 아스키코드로 바꾸라고한다.

Flag : picoCTF{A}

General Warmup 2 - Point : 50 [General Skills]

10진수인 27을 2진수로 변환하라고 한다.

Flag : picoCTF{11011}

General Warmup 3 - Point : 50 [General Skills]

0x3D를 10진수로 변환하라고 한다.

Flag : picoCTF{61}

Resources - Point : 50 [General Skills]

웹 사이트에서 flag를 찾으라고 한다. 그냥 들어가서 command + f 누르고 picoCTF{} 플래그 형식검색했더니 나왔다.

Flag :picoCTF{xiexie_ni_lai_zheli}

Reversing Warmup 1 - Point : 50 [Reversing]

Radare2를 통해서 run 파일을 열고 확인해본 결과 picoCTF{welc0m3_t0_r3VeRs1nG} 라는 문구를 넘겨주고 있었다.

Flag : picoCTF{welc0m3_t0_r3VeRs1nG}

Reversing Warmup 2 - Point : 50 [Reversing]

dGg0dF93NHNfczFtcEwz 를 아스키형식으로 Base64 디코딩 하면 된다.

Flag : picoCTF{th4t_w4s_s1mpL3}

Crypto Warmup 1 - Point : 50 [Cryptography]

llkjmlmpadkkc 를 키 값인 thisisalilkey 를 주고 답을 찾으라 한다. 키 값을 주고 문자열을 바꾸는 형식인 Vigenere Cipher를 참고해 풀었다.

Flag : picoCTF{secretmessage}

Crypto Warmup 2 - Point : 50 [Cryptography]

cvpbPGS{guvf_vf_pelcgb!} 이런 문자가 주어졌는데 rot13으로 파이썬 코드 짜서 돌려줬다.

import codecs
flag = codecs.encode('cvpbPGS{guvf_vf_pelcgb!}','rot_13')
print(flag)
Flag : picoCTF{this_is_crypto!}

Grep 1 - Point : 75 [General Skills]

file이라는 이름의 파일이 주어졌는데 이 문제의 제목처럼 유닉스 계열의 명령어 grep으로 flag형식 문자열을 추출했다.

$ cat file | grep 'picoCTF'
picoCTF{grep_and_you_will_find_d66382d8}
Flag : picoCTF{grep_and_you_will_find_d66382d8}

net cat - Point : 75 [General Skills]

nc 접속하는 법을 알면 쉽게 풀 수 있다. 쉽게 터미널 열어서 접속해주면 된다.

$ nc 2018shell2.picoctf.com 37721
That wasn't so hard was it?
picoCTF{NEtcat_iS_a_NEcESSiTy_0b4c4174}
Flag : picoCTF{NEtcat_iS_a_NEcESSiTy_0b4c4174}

HEEEEEEERE'S Johnny! - Points : 100 [Cryptography]

passwd 파일을 칼리리눅스에서 Johnny이였나 거기에 넣어주고 하면 root계정의 비밀번호가 나온다.

Flag : picoCTF{J0hn_1$_R1pp3d_289677b5}

strings - Point : 100 [General Skills]

유닉스 명령어 strings만 사용할 줄 알면 쉽게 풀 수 있다.

$ strings strings | grep pico
picoCTF{sTrIngS_sAVeS_Time_d3ffa29c}
Flag : picoCTF{sTrIngS_sAVeS_Time_d3ffa29c}

pipe - Point : 110 [General Skills]

nc 서버로 접속하고 파이프를 사용해서 grep으로 문자열을 찾아줬다.

$ nc 2018shell2.picoctf.com 44310 | grep pico
picoCTF{almost_like_mario_a13e5b27}
Flag : picoCTF{almost_like_mario_a13e5b27}

Inspect Me - Point : 125 [Web Exploitation]

개발자도구를 들어가서 sources를 보면 html css js 소스가 있다. 소스를 확인해본 결과 flag가 주석처리 되어있다.

Flag : picoCTF{ur_4_real_1nspect0r_g4dget_b4887011}

grep2 - Point : 125 [General Skills]

쉘 서버에 grep을 사용해서 풀었다. /problems/grep-2_3_826f886f547acb8a9c3fccb030e8168d/ 안에 엄청 수 많은 폴더들이 있었다. grep의 -r 옵션이 하위 디렉토리의 파일들의 문자열을 찾아준다.

$ grep -r pico
files/files2/file20:picoCTF{grep_r_and_you_will_find_556620f7}
Flag : picoCTF{grep_r_and_you_will_find_556620f7}

Client Side is Still Bad - Point : 150 [Web Exploitation]

딱 웹 사이트 들어가자마자 Secure Login Sever를 들어가려면 자격이 필요하다나.. 그래서 소스를 보니 자바스크립트가 있었다.

자바스크립트를 보면 verify라는 함수에서 입력 조건이 써있어서 그대로 써주고 그 입력 조건이 맞으면 alert 뜨게 하는거였다. picoCTF{client_is_bad_9117e9} 이걸 넣어주면 You got the flag! 틀리면 Incorrect password라고 뜬다.

Flag : picoCTF{client_is_bad_9117e9}

Recovering From the Snap - Point : 150 [Forensics]

animals.dd 파일을 받았는데 용량이 10MB나 됐다... 먼저 시그니처를 별다른게 없어서 밑으로 조금 내리다가 보니까 오프셋 9A00 에서 FF D8 FF E0 00 10 4A 46 49 46 jpg 시그니처를 확인하고는 animals.dd파일 안에 여러 이미지가 담겨 있는 것을 알게되었다.

jpg의 푸터 시그니처인 FF D9를 찾았다. 오프셋 A400까지였다. 9A00 ~ A400까지 한 이미지를 추출해냈다.

하지만 이 그림에는 flag가 없었다. 이런 문제는 보통 그림에 photoshop을 사용해서 들어간다.

그래서 photoshop이라는 텍스트를 검색해서 photoshop이 포함되어있는 jpg 파일을 추출해냈다.

오프셋 2DCA00 부터 2E67B0 까지였다. 이 오프셋 범위만 따로 추출해냈더니 flag 이미지가 나왔다.

Flag : picoCTF{th3_5n4p_happ3n3d}

admin panel - Point : 150 [Forensics]

data.pcap 파일을 내려받아서 wireshark 를 이용해 pcap 폴더를 열었다. 여기서 프로토콜이 HTTP인 것을 확인해보니 login, logout, %2f, admin 등등 여러 패킷이 전송된 것을 볼 수 있었다. 이 패킷들을 따로 추출해서 확인해봤다.

텍스트파일중 login(2)를 확인해봤더니 flag가 적혀있었다. user=admin&password=picoCTF{n0ts3cur3_df598569}

Flag : picoCTF{n0ts3cur3_df598569}

caesar cipher 1 - Point : 150 [Cryptography]

ciphertext라는 text파일을 받고 열어본 결과 picoCTF{grpqxdllaliazxbpxozfmebotlvlicmr} 이렇게 나와있는데 대괄호 안을 카이사르 암호로 치환하면 된다. 파이썬 코드로 돌렸더니 ROT23번째가 flag였다.

def translate(string, key, mode):
   translated_string = ""

   if mode == 'decrypt':
       key = -key

   for char in string:
       if char.isalpha():
           num = ord(char)
           num += key

           if char.isupper():
               if num > ord('Z'):
                   num -= 26
               elif num < ord('A'):
                   num += 26
           elif char.islower():
               if num > ord('z'):
                   num -= 26
               elif num < ord('a'):
                   num += 26
           translated_string += chr(num)
       else:
           translated_string += char
   return translated_string

encrypted = 'grpqxdllaliazxbpxozfmebotlvlicmr' # input
for i in range(1, 26):
   decrypted = translate(encrypted, i, 'decrypt')
   print ("".join(['ROT', str(i), ': ', decrypted]))
Flag : picoCTF{justagoodoldcaesarcipherwoyolfpu}

environ - Points : 150 [General Skills]

유닉스 셸 명령어 env를 이용해서 환경변수를 확인했다.

$ env | grep pico
SECRET_FLAG=picoCTF{eNv1r0nM3nT_v4r14Bl3_fL4g_3758492}
Flag : picoCTF{eNv1r0nM3nT_v4r14Bl3_fL4g_3758492}

hex editor - Points : 150 [Forensics]

HxD로 Find로 pico 형식을 입력하니까 바로 나왔다.

Flag : picoCTF{and_thats_how_u_edit_hex_kittos_8BcA67a2}

Secret Agent - Points : 200 [Web Exploitation]

시크릿 에이전트를 사용할 줄 몰라서 시간 엄청 뺏긴 문제다. http://2018shell2.picoctf.com:3827/flag 이 링크에서 flag를 누르면 이상한게 뜨는데 내가 사용하는 크롬,웨일,사파리 등등 뜨길래 당황했다. 정말 이런 문제 처음 접해봤지만 신기했다. flag를 누르면 너는 구글이 아니라고 뜨길래 구글에서 엄청 찾다가 구글 봇이라는 걸 찾았다. 내가 사용하고있는 에이전트를 구글 봇으로 바꿔주면 된다.

개발자모드(F12) 들어가서 NetWork 들어가서 밑에 콘솔창 옆에 점 세개 있는거 누르고 NetWork Conditions 누르고 거기서 에이전트를 구글봇으로 바꿔주고 다시 웹 사이트 접속해서 FLAG 눌러주면 flag가 나온다.

Flag : picoCTF{s3cr3t_ag3nt_m4n_12387c22}

Truly an Artist - Points : 200 [Forensics]

HxD로 pico형식 찾으니까 바로 나왔다.

Flag : picoCTF{look_in_image_7e31505f}

now you don't - Points : 200 [Forensics]

배경이 완전히 빨강색이고 PNG이길래 그림판으로 색을 덮어줬더니 Flag가 나왔다.

Flag : picoCTF{n0w_y0u_533_m3}

what base is this? - Points : 200 [General Skills]

nc로 접속하면 진수를 아스키코드를 30초안에 바꾸라고 나온다. 쉽게 쓱싹 바꿔줬다.

$ nc 2018shell2.picoctf.com 1225
We are going to start at the very beginning and make sure you understand how data is stored.
apple
Please give me the 01100001 01110000 01110000 01101100 01100101 as a word.
To make things interesting, you have 30 seconds.
Input:
apple
Please give me the 67696d70 as a word.
Input:
gimp
Please give me the 164 165 162 164 154 145 as a word.
Input:
turtle
You got it! You're super quick!
Flag: picoCTF{delusions_about_finding_values_451a9a74}

store - Points : 400 [General Skills]

r2 열어서 분석했더니 쉽게 나왔다.

이런게 400점이나…

Flag : picoCTF{numb3r3_4r3nt_s4f3_cbb7151f}

quackme - Points : 200 [Reversing]

주소의 값을 가져와서 xor 연산해주면 된다. 여기서 알게된 점이 flag 형식을 통해 문제를 푸는 방법을 듣고 좋은 팁을 알아갔다.

table = [0x29, 0x6, 0x16, 0x4f, 0x2b, 0x35, 0x30, 0x1e, 0x51, 0x1b, 0x5b, 0x14, 0x4b, 0x8, 0x5d, 0x2b, 0x52, 0x17, 0x1, 0x57, 0x16, 0x11, 0x5c, 0x7, 0x5d]
flag = [0x59, 0x6f, 0x75, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x75, 0x63, 0x6b]
answer = ""
for i in range(len(table)):
   answer += chr(table[i]^flag[i])
print(answer)

Flag : picoCTF{qu4ckm3_7ed36e4b}

quackme up - Points : 350 [Reversing]

11 80 20 E0 22 53 72 A1 01 41 55 20 A0 C0 25 E3 95 20 15 35 20 15 00 70 C1 이 값이 나오도록 만들라고 해서 이 문제는 노가다로 1을 입력하면 05 이런식으로 나오길래 알파벳, 특수기호, 번호를 입력해서 값을 찾아서 일일이 매칭시켜줬다.

Flag : picoCTF{qu4ckm3_8c02c0af}

후기

우리반에서 보안 공부하는 애들과 함께 나간 대회이다. 이 기회를 통해 친구들과 재밌게 즐겼던거 같다. 포렌식 문제들은 거의 스테가노 문제였고 많이 풀었던 형식들이라 쉽게 풀 수 있었지만 어려운 포렌식 문제는 아직 능력이 안되서 그런지 풀지 못했다. 리버싱은 대회가 끝나고 친구의 도움으로 풀었다. 아직은 너무 부족하고 열심히 공부해서 내년에는 꼭 풀 수 있도록 해야겠다.

'CTF WriteUp' 카테고리의 다른 글

2019 Dimi CTF Prequal Writeup  (0) 2019.08.04
2019 Tamu CTF Writeup  (0) 2019.08.04
2019 Codegate Quals Writeup  (0) 2019.08.04
2018 고등해커 본선 Writeup  (0) 2019.08.04
2018 OtterCTF Writeup  (2) 2018.12.11
2018 picoCTF Writeup  (0) 2018.11.22
layout: post title: Memory Forensic Volatility date: 2018-09-18 mathjax: true tag: [메모리포렌식, MemoryForensic, Volatility, 메모리분석] categories: 0x01_MemoryForensic 

 

Info

  • Python 기반으로 반든 Memory Forensic Tool

  • Windows, Linux, Mac OS에서 실행 가능하다.

  • 오픈소스 형태이며, Plugin으로 여러 기능을 사용할 수 있다

  • 직접 Plugin을 만들어서 사용할 수 있다.

Available

  • 침대사고대응 관련

  • 포렌식 관련 CTF

Extension

메모리 덤프 파일(.img, .raw, .dmp)

하이버네이션 파일(.hiber)

가상 머신 메모리(.vmem)

information available

  • 트리 형태 프로세스 리스트

  • 프로세스가 로드한 DLL과 핸들

  • 프로세스 환경변수와 Import

  • 네트워크 정보

  • 시스템에서 로드한 드라이버 목록

  • 루트킷으로 은닉된 프로세스 오프셋

  • SID(보안 식별자)

  • PID

  • 스레드 수, 핸들 수, 시작 및 종료 시간

Command Format

 

$ vol.py -f [이미지경로][플러그인]

 

$ vol.py -f [이미지경로] --profile=[운영체제][플러그인]

Operating system information commands

 

$ vol.py -f memory.dd imageinfo
  • 운영체제, 메모리 주소 공간, DTB, KDBG, KCPR 주소 출력

Time Info Commands

 

$ vol.py -f memory.dd timeliner —output-file result.csv
  • 아티팩트를 시간과 함께 csv 파일로 출력

Executable Extract Commands

 

$ vol.py -f [이미지경로] procexedump -D [저장경로] -p [PID]

 

Option

 

옵션 설명
-h, --help 모든 옵션의 도움말과 해당 옵션의 디폴트 값 출력
--conf-file 설정파일의 경로를 설정
-d, --debug Volatility를 디버그함
--plugins 플러그인이 위치할 폴더 설정(세미콜론을 이용해 추가 디렉터리 포함이 가능함)
--info 지원 운영체제나 각 플러그인의 기본 정보 출력
--cache-directory 캐시 파일이 저장된 경로를 설정
--cache DTB(Directory Table Base), KDBG, KPCR 주소 등, 여러 변수를 저장해 추후에 사용할 수 있도록 함
--tz 타임존을 설정한다(유닉스 계열만 가능하다)
-f, --filename 메모리 이미지의 경로를 설정
--profile 운영체제 및 버전을 설정
-l, --location 메모리 이미지의 URN 경로를 설정
-w, -write 쓰기모드를 활성화
--use-old-as 레거시 주소 공간을 쓰도록 설정
--dtb DTB 주소를 설정
--output 출력 파일의 포맷을 설정
--output-file 출력 파일의 경로 설정
-v, --verbose 진행상황을 출력
-g, --kdbg KDBG 주소 값을 설정
-k, --kpcr KPCR 주소 값을 설정

 

Plugin

 

기능 플러그인
이미지 정보 imageinfo, kdbgscan, kpcrscan
프로세스, DLL pslist, pstree, psscan, dlllist, dlldump, handles, getsids, verinfo, enumfunc
프로세스 메모리 Memmap, memdump, procmemdump, procexedump, vadwalk, vadtree, vadinfo, vaddump
커널 메모리 & 오브젝트 connections, connscan, sockets, sockscan, netscan
레지스트리 Hives can, hivelist, printkey, hivedump, hashdump, lsadump, userassist
크래쉬 덤프, 하이버네이션 변환 crashinfo, hibinfo, imagecopy
Malware, 루트킷 Malfind, svcscan, ldrmodules, impscan, apihooks, idt, gdt, threads, callbacks, driverip, devicetree, pswview, ssdt_ex, timers
기타 strings, volshell, bioskbd, inspectcache, patcher, testsuite
Timeliner Plugin

 

아티팩트 플러그인
프로세스 pslist, psscan, pstree, procmemdump
쓰레드 thrdscan
네트워크, 소켓 netscan(Win7), connections(XP), connscan(XP)
레지스트리 Hivelist, printkey, userassist
실행파일(exe) Procexedump, handles
DLL 및 핸들 dlllist, dlldump
드라이버 driverscan, driverirp, moddump
루트킷 Plugin

 

플러그인 이름 설명
psxview pslist와 psscan으로 숨겨진 프로세스를 찾음
drivers can 메모리에서 드라이버 오브젝트 스캔
apihooks API/DLL 함수 후크를 찾음
ssdt SSDT(System Service Descriptor Table)에서 후크를 찾음
driverirp (IRP)I/O Request Packet 후크를 찾음
idt IDT(Interrupt Descriptor Table)을 출력

 

 

 

'Hacking' 카테고리의 다른 글

[2016codegate]Watermelon  (0) 2019.11.13
ARM Reversing  (0) 2019.08.04
메모리 보호기법 해제  (0) 2018.12.19
Volatility Commands  (0) 2018.12.02
메모리포렌식 Volatility  (0) 2018.10.09
PNG 구조  (0) 2018.10.09
layout: post title: PNG 구조(Structure) date: 2018-09-18 mathjax: true tag: [PNG, PNGSignature, PNGStructure, PNG구조] categories: 0x00_Info-Forensic 

PNG File Signature

89 50 4E 47 0D 0A 1A 0A : ‰PNG....

PNG 파일은 8Bytes의 시그니처를 가진다.

그 뒤에는 Chunk라는 그룹으로 나뉘어져 이미지 정보가 저장된다.

PNG Chunk

IHDR Chunk : 이미지 헤더 정보(첫 번째 청크)

PLTE Chunk : 팔레트 테이블 정보(색공간 표시)

IDAT Chunk : 이미지 데이터 정보(IDAT 청크로 쪼개질 수 있는 이미지 테이터 정보 표시)

IEND Chunk : 이미지 트레일러 정보(이미지의 끝을 표시)

IHDR

IHDR 청크는 PNG 파일 맨 앞에 위치하는 청크로, PNG 이미지의 크기, 필터링 방식, 압축 방식 등을 알 수 있다. IHDR은 항상 13바이트이다.

{
Length : 00 00 00 0D (13 byte),
Chunk Type : IHDR,
Chunk Data ( 13 byte ),
{
  Width (4 byte),
  Height (4 byte),
  Bit depth (1 byte),
  Color Type (1 byte),
  Compression method (1 byte),
  Filter method (1 byte),
  Interlace method (1 byte),
}
CRC
}

Width, Height

이미지의 폭과 높이를 지정한다. 이 값을 바탕으로 이미지 데이터를 디코딩하고 출력한다. 따라서 이 부분을 조작하면 이미지를 일그러뜨리거나 이미지의 아랫부분을 감추는 것 등도 가능하다.

Bit depth

Bit depth 하나의 채널(channel)이 몇 비트로 구성될 지를 정한다. 이미지의 한 픽셀은 하나 또는 여러개의 채널로 구성될 수 있다.

Color Type

Color Type은 PNG 이미지의 색상을 어떻게 구성할 것인지를 정한다.

Compression method

PNG 압축 표준 : Deflate

Filter method

현재까지 PNG에서 표준으로 정의된 필터링 방식은 한 가지다.

Interlace method

웹 페이지 등에 이미지를 표시할 때 이미지 로딩이 완료되기 전에 먼저 해상도가 낮은 이미지를 보여주기 위하여 사용된다.

IDAT

IDAT청크는 이미지의 실제 데이터가 들어가는 부분이고, 픽셀 데이터는 필터링과 압축을 거쳐 IDAT청크에 저장된다. 한 PNG는 여러 IDAT 청크를 가지는데, 이는 데이터를 적절한 사이즈로 전송하기 위한 것이다. 일반적으로 하나의 IDAT 청크당 65534바이트의 크기를 갖는다. 그래서 PNG는 전체 이미지 데이터를 한꺼번에 압축한 뒤, 여러 IDAT 청크에 나누어 담는 방식을 사용한다. 따라서, 모든 IDAT 청크가 있어야만 이미지 디코딩이 가능하다.

Encoding : Pixel Data -> Filter -> Compression -> IDAT Chunk Data
Decofing : IDAT Chunk Data -> Compression -> Unfilter -> Pixel Data

IEND

IEND청크는 이미지의 맨 뒤에 위치하는 청크로 PNG 파일의 끝을 나타낸다. 데이터를 담는 목적으로 사용되지 않으므로 길이는 항상 0이다.

Footer Signature, Trailer Signature

49 45 4E 44 AE 42 60 82 : IEND®B`‚

'Hacking' 카테고리의 다른 글

[2016codegate]Watermelon  (0) 2019.11.13
ARM Reversing  (0) 2019.08.04
메모리 보호기법 해제  (0) 2018.12.19
Volatility Commands  (0) 2018.12.02
메모리포렌식 Volatility  (0) 2018.10.09
PNG 구조  (0) 2018.10.09

+ Recent posts