위처럼 버튼에서 플래그를 나오게끔 해달라고 한다.

크롬의 개발자 도구를 통하여, form 안에 있는 input value를 button -> flag로 해줬다.

정상적으로 내뱉는 것을 확인할 수 있었다.

'WarGame or CTF > Wargame' 카테고리의 다른 글

[ctf.j0n9hyun.xyz] 보물  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Hash  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Button  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Hidden  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Authorized  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Hidden Flag  (0) 2019.06.24

사이트를 들어가게 될 경우 1, 2, 3, 4로 정렬이 되어있다.

하지만 위에 "5번 파일에 플래그가 있다악!!!!!!!"을 보게될 경우,

5번을 찾아야되겠지만, 없는 것을 볼 수 있다.
어떤 방식으로 굴러가는지 알기 위해 아무거나 눌러준다.

1번 파일을 눌러줄 경우 /?id=1 로 보내주는 것을 확인할 수 있다.
그렇다면 우리는 5번 파일을 눌러줘야된다. 그렇다면? /?id=5을 해주면 되는 것이다.
정말 간단하고 쉬운 문제이다.

'WarGame or CTF > Wargame' 카테고리의 다른 글

[ctf.j0n9hyun.xyz] Hash  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Button  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Hidden  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Authorized  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Hidden Flag  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Home  (0) 2019.06.20

접속할 경우 사진처럼 나오게 된다.
하지만 이것으로 flag를 찾기 힘들 수 있으니, 정보 수집 능력(?)을 위해서 소스 보기를 한번 해보도록 하자.

auth 라는 함수가 False가 되어 있다고 힌트가 알려준다.
그렇다면 get로 /?auth=true 해줬더니?!?!?!

그랬더니 뚝딱 나왔다.

'WarGame or CTF > Wargame' 카테고리의 다른 글

[ctf.j0n9hyun.xyz] Button  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Hidden  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Authorized  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Hidden Flag  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Home  (0) 2019.06.20
Simple SQL Injection  (0) 2019.03.29

저는 해당 문제가 해킹의 기본기를 테스트하는 것이라고 생각합니다.

해킹을 하기 위해서는 대상을 알아야되기 때문에, 정보 수집이 필요로 합니다.

정보 수집을 하기 위한 것이 무엇이냐고 물어볼 수 있습니다.

보통 구글과 같은 검색 엔진경우 흔히 봇을 통해서 정보를 수집을 하고, 우리가 보고 있는 검색 사이트에 반영이 된다고 보시면 됩니다.
분명, 봇이 방문하기 꺼려하는 사이트가 있지 않을까요?
그래서 만들어진게 robots.txt 입니다. 

robots.txt 내용에 나는 어떤 로봇을 싫어해, 아니면 난 모든 봇을 싫어해 라고 봇에게 전달할 수 있다고 보면 되는거에요!

이제 robots.txt 에 대해서 알아봤으니, 한번 문제로 돌아가볼까요?

귀엽고 깜찍한 로봇이 기다리고 있다.
이 사진을 통해서 강력한 힌트를 제공하고 있다고 생각하고 있다.
그래서 링크 뒤에 robots.txt를 입력해주었다.

User-agent: *
Disallow: /robot_flag/

위와 같이 나오게 된다.

위에 있는 부분을 해석하자고 하면, /robot_flag/에 대해서 검색 엔진에게 검색하지말라는 것이다.
그렇다면 이것을 활용할 수 있다면, flag를 알아낼 수 있다.

그렇게 해서 간단하게 flag를 구할 수 있었다.

'WarGame or CTF > Wargame' 카테고리의 다른 글

[ctf.j0n9hyun.xyz] Hidden  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Authorized  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Hidden Flag  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Home  (0) 2019.06.20
Simple SQL Injection  (0) 2019.03.29
system32.kr [Forensics] Cert  (0) 2018.08.02

 

curl --verbose --header "X-Forwarded-For: 127.0.0.1" http://ctf.j0n9hyun.xyz:2034/

http://ctf.j0n9hyun.xyz:2034

 

'WarGame or CTF > Wargame' 카테고리의 다른 글

[ctf.j0n9hyun.xyz] Authorized  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Hidden Flag  (0) 2019.06.24
[ctf.j0n9hyun.xyz] Home  (0) 2019.06.20
Simple SQL Injection  (0) 2019.03.29
system32.kr [Forensics] Cert  (0) 2018.08.02
system32.kr  (0) 2018.08.02

보통 논문이나, 그런 곳에서는 SYN Cookie를 사용을 하라고 한다.
하지만 SYN Cookie도 좋은 선택으로 보인다.

SYN Cookie 원리는 SYN 대기열이 가득차면 서버가 새로운 연결을 거부하지 않고 계속 SYN 대기열이 확장 된 것처럼 동작하기에 SYN Flooding에 대응하기 좋은 것은 맞지만,

Dos에 적용하기 좋은 것 같다. 하지만 직접 테스트할 경우에는 DDoS 공격 유형에서는 대응하기 힘들었다. 이에 대해서는 조사가 필요할 것 같다...!

그것을 보완하기 위해 어떻게 하면 좋을까? 하고 생각을 하였다.
그리고 알아낸 것은 SYN Proxy를 사용할 경우 공격을 완화할 수 있다는 것이였다.

SYN Proxy는 유효한 TCP 연결은 통과시키고, 유효하지 않은 TCP 연결은 DROP 처리가 됨으로써,
정상적인 서비스를 운영할 수 있다는 좋은 결과를 얻을 수 있다.

TCP SYN Flooding(디도스 공격류)를 피해를 완화하기에 엄청 탁월한 선택임을 알 수 있었다.

아 물론 혹시 모르니 SYN Cookie와 SYN Proxy와 같이 쓴다면, 무난한 것으로 보인다.

+) SYN Cookie나 SYN Proxy에 대해서 연구해봐야될 것으로 보인다.

  1. 사용자 YunSeok, Hong 2021.08.21 00:37 신고

    SYN Proxy도 일정 이상 공격이 유입될 경우, 한계가 뚜렷하다.

프로그램이 실행되어 프로세스가 메모리에 적재되고
메모리와 레지스터가 어떻게 동작하는지 알아보기 위하여,
간단한 프로그램을 예를 들어 확인을 해봅시다! :)

void function(int a, int b, int c){
    char buffer1[15];
    char buffer2[10];
}

void main(){
    function(1, 2, 3);
}

위 프로그램은 별 동작도 하지 않은 간단한 프로그램입니다.
Stack이해하기 위해 코딩 프로그램입니다.
그러기에 Stack에 이해하기에 좋은 코드라고 할 수 있습니다. :)

gcc -S -o simple.asm simple.c

C 프로그램을 어셈블리 코드로 변환하기 위해 위와 같은 옵션을 사용하여 컴파일하였습니다.

-S 옵션을 이용하여, 컴파일을 하는 것이 중요하다. :)

이렇게 해서 명령어타이핑해서 만들어진 어셈블리 코드컴파일러의 버전에 따라 다르게 생성됩니다.
이유는 컴파일러버전업 되면서 레지스터 활용성을 높인다거나 보안 성능을 높이기 위해 혹은 수행 속도 개선,
알고리즘 변화다양한 원인으로 다른 결과물을 만들어냅니다.

만들어진 어셈블리 코드를 보기 위해서 cat simple.asm타이핑 할 경우 아래와 같이 나옵니다.

winstar0070@YunSeok-PC:~$ cat simple.asm
        .file   "simple.c"
        .text
        .globl  function
        .type   function, @function
function:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        subq    $48, %rsp
        movl    %edi, -36(%rbp)
        movl    %esi, -40(%rbp)
        movl    %edx, -44(%rbp)
        movq    %fs:40, %rax
        movq    %rax, -8(%rbp)
        xorl    %eax, %eax
        nop
        movq    -8(%rbp), %rax
        xorq    %fs:40, %rax
        je      .L2
        call    __stack_chk_fail@PLT
.L2:
        leave
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   function, .-function
        .globl  main
        .type   main, @function
main:
.LFB1:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    $3, %edx
        movl    $2, %esi
        movl    $1, %edi
        call    function
        nop
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE1:
        .size   main, .-main
        .ident  "GCC: (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0"
        .section        .note.GNU-stack,"",@progbits

GCC 버전을 볼 경우 7.3.0라는 것을 주목할 수 있다.

simple.c 프로그램이 컴파일이 되어, 실제 메모리 상어느 위치존재하게 될지 알아보기 위해서 컴파일을 한 다음 gdb를 이용하여 어셈블리 코드와 메모리적재logical address를 살펴보도록 하겠습니다.

winstar0070@YunSeok-PC:~$ gcc -o simple simple.c
winstar0070@YunSeok-PC:~$ gdb simple
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from simple...(no debugging symbols found)...done.
gdb-peda$ pdisas main
Dump of assembler code for function main:
   0x00000000000006a1 <+0>:     push   rbp
   0x00000000000006a2 <+1>:     mov    rbp,rsp
   0x00000000000006a5 <+4>:     mov    edx,0x3
   0x00000000000006aa <+9>:     mov    esi,0x2
   0x00000000000006af <+14>:    mov    edi,0x1
   0x00000000000006b4 <+19>:    call   0x66a <function>
   0x00000000000006b9 <+24>:    nop
   0x00000000000006ba <+25>:    pop    rbp
   0x00000000000006bb <+26>:    ret
End of assembler dump.
gdb-peda$ pdisas function
Dump of assembler code for function function:
   0x000000000000066a <+0>:     push   rbp
   0x000000000000066b <+1>:     mov    rbp,rsp
   0x000000000000066e <+4>:     sub    rsp,0x30
   0x0000000000000672 <+8>:     mov    DWORD PTR [rbp-0x24],edi
   0x0000000000000675 <+11>:    mov    DWORD PTR [rbp-0x28],esi
   0x0000000000000678 <+14>:    mov    DWORD PTR [rbp-0x2c],edx
   0x000000000000067b <+17>:    mov    rax,QWORD PTR fs:0x28
   0x0000000000000684 <+26>:    mov    QWORD PTR [rbp-0x8],rax
   0x0000000000000688 <+30>:    xor    eax,eax
   0x000000000000068a <+32>:    nop
   0x000000000000068b <+33>:    mov    rax,QWORD PTR [rbp-0x8]
   0x000000000000068f <+37>:    xor    rax,QWORD PTR fs:0x28
   0x0000000000000698 <+46>:    je     0x69f <function+53>
   0x000000000000069a <+48>:    call   0x540 <__stack_chk_fail@plt>
   0x000000000000069f <+53>:    leave
   0x00000000000006a0 <+54>:    ret
End of assembler dump.
gdb-peda$

이렇게 나왔습니다.
앞에 붙어 있는 주소는 logical address입니다. 이 주소를 자세히 보면 function() 함수가 아래에 자리 잡고,
main() 함수는 위에 자리를 잡고 있음을 알 수 있습니다.

따라서 메모리 주소를 바탕으로 생성
이 프로그램의 segment 모양<그림 1>과 같이 될 것임을 유추할 수 있습니다.
<그림 1>과 같이 segment가 구성되었습니다.

segment의 크기프로그램마다 다르기 때문에
최상위 메모리의 주소그림과 같이 구성되지 않을 수도 있습니다.

segmentlogical address0x0000000000006부터 시작하지만,
실제 프로그램 컴파일과 링크되는 과정에서 다른 라이브러리들을 필요로 하게 됩니다.
따라서 코딩한 코드가 시작되는 시점시작점과 일치하지는 않을 것이며,

stack segment 역시 0xBFFFFFF까지 할당 되지만
역시 필요한 환경 변수실행 옵션으로 주어진 변수 등 등에 의해서
가용한 영역은 그 보다 조금 더 아래에 자리 잡고 있습니다.

simple.c전역 변수를 지정하지 않았기 때문에
data segment에는 링크된 라이브러리전역 변수 값만 들어 있을 것입니다.

이제 프로그램이 시작되면 EIP 레지스터
즉, CPU가 수행명령이 있는 레지스터main() 함수시작되는 코드를 가리키고 있을 것입니다.
main() 함수의 시작점 0x6a1가 되겠지요.

이제 명령어씩 따라가서 보도록 합시다.

ESP가 정확히 어느 지점을 가리키는지 알아보기 위하여,
gdb를 이용하여, 레지스터 값을 알아봤습니다.

gdb-peda$ break *0x6a1
Breakpoint 1 at 0x6a1
gdb-peda$ r
Starting program: /home/winstar0070/simple

gdb-peda$ info register esp
esp            0xfffee670       0xfffee670


작성 중...

'Study > System' 카테고리의 다른 글

프로그램 구동 시 segment에서는 어떤 일이?  (0) 2019.06.03
Buffer Overflow 대해서  (0) 2019.06.03
시스템 해킹이란  (0) 2019.05.26

버퍼 오버 플로우는 값을 받는 함수가 최대로 받을 수 있는 버퍼를 제한하지 않아서 발생하는 부분이다.
그래서 오버 플로우 말 그대로 가득채워서,
특정 값으로 씌어, 맛깔나게 조리해서 노는 공격 기법이다.

'Study > System' 카테고리의 다른 글

프로그램 구동 시 segment에서는 어떤 일이?  (0) 2019.06.03
Buffer Overflow 대해서  (0) 2019.06.03
시스템 해킹이란  (0) 2019.05.26

무엇인지

시스템을 이루는 것(운영체제, 소프트웨어, 하드웨어)에 있는 취약점해킹하는 것을 말한다.

어떻게 배우는 것인지

시스템 해킹을 알기 위해서는 운영 체제이랑 친해져야 된다.
운영 체제는 주로 윈도우, 리눅스사용한다.
하지만 운영체제마다 커널이 다르기 때문에 따로 따로 나눠서 공부한다.

리버싱 엔지니어링

리버싱 엔지니어링 악성코드 분석이나 CTF(플래그 찾는 곳)에서 주로 사용된다.
프로그램
리버스 엔지니어링 (IDA 등)을 이용하여 구동 원리를 알아내서,
프로그램 개발사에서 생각도 못한 취약점발견해야 프로그램해킹할 수 있다.


'Study > System' 카테고리의 다른 글

프로그램 구동 시 segment에서는 어떤 일이?  (0) 2019.06.03
Buffer Overflow 대해서  (0) 2019.06.03
시스템 해킹이란  (0) 2019.05.26
I'm very good player of this game. Play better than me and break my record to capture the flag.

Attention:

- There are two levels in this Android Game. You must hit my high score in each level for capturing the flag, so your flag consists of two parts (easy and hard). Flag = Easy Part (1)+ Hard Part (2);

- The BAZAAR app must be installed in your Device.

Good Luck!

Tale_Rang.apk
4.37MB

디컴파일 후 sources/kfb/freed/FourthActivity.java 에 

        if (MyApplication.isWrongortimedout()) {
            if (MyApplication.isEnglish()) {
                ttvv2.setText("Timed Out !");
            } else if (MyApplication.isHard()) {
                if (MyApplication.getScore() < MyApplication.getBestHardScore()) {
                    ttvv2.setText("اتمام وقت !");
                } else {
                    ttvv2.setText("TExPIFVVVENURikgfQ==");
                }
            } else if (MyApplication.getScore() < MyApplication.getBestScore()) {
                ttvv2.setText("اتمام وقت !");kf
            } else {
                ttvv2.setText("VVVUQ1RGIHsgbWQ1KEhF");
            }

TExPIFVVVENURikgfQ==, VVVUQ1RGIHsgbWQ1KEhF

두 개를 한번 base64로 decode(원래 형태)로 되돌렸다.

TExPIFVVVENURikgfQ== LLO UUTCTF) }
VVVUQ1RGIHsgbWQ1KEhF UUTCTF { md5(HE

UUTCTF { md5(HELLO UUTCTF) }

위와 같은 형식이 된다.

그렇다고 저대로 flag를 인증을 하려고 하면,
당연히 안되는 것이 정상이다.

HELLO UUTCTF를 md5로 encrpytion을 해주자.

The MD5 hash for HELLO UUTCTF is : 7c34446d10bbb60d0cae15059fffc98d

그렇게해서 flag는 UUTCTF{7c34446d10bbb60d0cae15059fffc98d}가 된다.

 

'Study > Reversing' 카테고리의 다른 글

Break My Record  (0) 2019.04.28

+ Recent posts