반응형

Docker

https://docs.docker.com/install/linux/docker-ce/ubuntu/


Docker Compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose


문제 서버 만들때 매우 좋다

문제 하나 터져서 다른 문제가 터지는 일을 방지할 수 있음


내가 쓰는 거

docker-compose.yml

version: '2.2'


services:

    treefrog:

        build: ./

        volumes: 

            - ./share:/home/treefrog:ro

            - ./xinetd:/etc/xinetd.d/xinetd:ro

            - ./tmp:/tmp:ro

        ports:

            - "10101:10101"

        expose:

            - "10101"

        

networks:

    default:

        external:

            name: treefrog


Dockerfile

FROM ubuntu:16.04

MAINTAINER KSHMK

RUN apt update

RUN apt install xinetd -y

RUN apt install libc6-dev-i386 -y

RUN useradd -m {계정명}

RUN chmod 774 /tmp

RUN chmod -R 774 /var/tmp

RUN chmod -R 774 /dev

RUN chmod -R 774 /run

RUN chmod 1733 /tmp /var/tmp /dev/shm

RUN chown -R root:root /home/{계정명}

CMD ["/usr/sbin/xinetd","-dontfork"] 


xinetd

service treefrog 

{

    disable = no

    type        = UNLISTED

    wait        = no

    server      = /home/treefrog/treefrog

    socket_type = stream

    protocol    = tcp

    user        = treefrog

    port        = 10101

    flags       = REUSE


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

BFF Fuzzer 약간설명&옵션설명  (1) 2016.02.17
SongSari - Basic Bof  (0) 2015.12.01
Pin Tool 간단 설명  (0) 2015.11.21
Layer7 CTF SPILL  (0) 2015.11.02
PlaidCTF-2013 pork  (0) 2015.10.28
반응형

Down the Reversing Hole


문제 이름에 리버싱이라 적혀 있지만 MISC라고 문제 설명에 적혀 있었다.

이게 무슨 의미인지 잘 모르겠지만 일단 IDA로 열어보기로 했다.



main함수의 내부는 간단하였다.

마지막에 flag를 출력하는 것을 보고 

"PCTF{"로 시작하면 되겠지라고 생각하고 z3를 사용하였다.



코드를 짜고 돌려보았다.



??????

다시 한번 main함수를 분석하니 "flag?" 라고 되어 있음을 보아

함정이라는 것을 짐작하였고, 조금더 분석하다가 DOS 헤더에 무언가 있는것을 발견하였다.



table 2개를 xor 한뒤 출력한다. DosBox로 열어보기로 했다.



FLAG: PCTF{at_l3a5t_th3r3s_d00m_p0rts_0n_d0s}

'CTF' 카테고리의 다른 글

Plaid CTF 2017 BB8  (0) 2017.06.02
SSG 2017 Write Up  (0) 2017.06.02
CodeGate 2017 Event Challenge Keypad  (0) 2017.04.14
DoubleS1405 Write UP  (0) 2017.04.01
Codegate2017 prequals Writeup  (0) 2017.02.15
반응형

CodeGate 3일차때 락 피킹존에서 디지털 락피킹 문제가 있는것을 알았습니다.



사람들이 많이 모여 있어서 궁금해서 찾아 갔습니다.



이렇게 구성되어 있습니다.

간단한(?) 펌웨어를 리버싱해서 키를 찾아 내는 것이라더군요.

문제를 풀면 피규어와 티셔츠를 준다고 하길레 문제를 풀기 시작했습니다.



티셔츠는 이렇게 멋지게 생겼습니다

문제는 노트북을 가져오지 않아 후배한테 빌려 문제를 풀었습니다.





상품으로 주는 티는 노트북을 돌려주며 같이 줬습니다.


디지털 도어락은 아두이노 우노(AVR) 로 만들어져 있었습니다.

*를 누르면 리셋, #을 누르면 Check를 한다고 합니다.

펌웨어의 파일 확장자는 bin이었고 이것은 아두이노에 펌웨어를 올릴때 사용하는 바이너리 파일입니다.

이제 IDA로 열어보았습니다.




IDA로 열때 주의해야 할 점이 Processor Type을 Atmel AVR로 맞춰줘야 한다는 점입니다.

계속 버튼을 누르다 보면 bin 파일을 선택하라는 창이 뜰 텐데 그 때 우리가 분석하려는 파일인 keypad.bin을 선택하면 됩니다.

AVR을 리버싱 할때 문제점이 Hex-Ray나 RD로 디컴파일이 불가능 하고 동적 분석하기 매우 까다롭기 때문에 정적 분석으로만 해야 하는 경우가 많습니다.


아두이노는 전원이 연결되었거나 리셋 버튼이 눌러졌을때 _RESET에서 시작하게 됩니다. (사실 인터럽트 헨들러가 _RESET로 점프하게 되어 있습니다)

_RESET에서는 아두이노를 초기화 하고 main을 실행하게 됩니다.

이 바이너리에서는 sub_66f입니다.


main 함수를 그래프입니다.

그래프를 보면 비교를 많이 하는 부분이 보입니다.

여기를 먼저 분석해 봅시다.



일단 r28의 값이 '#' 인지 비교하는 부분이 있습니다.

'#'은 입력한 비밀번호를 체크하는 버튼 입니다.

매우 수상하니 계속 이 부분을 분석해 봅시다.



계속 내려갈수록 메모리에서 값을 가져오고 숫자들과 비교하는 것을 볼 수 있습니다.



또한 하나라도 틀렸을때는 결과적으로 모두 같은 곳을 가리키고 있지만 모두 맞췄을 경우에는 다른 부분으로 가게 된다는 것을 알 수 있습니다.

각 메모리와 비교하는 값을 정리해 보면 

0x129 2

0x12A 4

0x12B 8

0x12C 9

0x12D 0

0x12E 1

0x12F 1

0x130 9


이렇게 나오게 됩니다. IDA로 보았을때는 0x200129로 나올 텐데 이것은

AVR은 데이터를 저장하는 메모리가 프로그램을 저장하는 메모리와 다르고 0x0부터 offset이 시작되지만

IDA에서는 0x200000에서부터 offset이 시작되기 때문에 실제로는 0x129에 저장되는 값이 IDA에서는 0x200129로 표시되게 됩니다.

따라서 저는 24890119가 비밀번호인줄 알고 시도했으나 아니였습니다.


따라서 0x129에 값을 집어넣는 부분을 찾아 봤습니다.

IDA에서 unk_200129에 커서를 놓은뒤 x를 누르면 참조하는 부분으로 바로 jump가 가능합니다.



이곳 입니다. 0x129에 값을 넣는 코드는 있지만 다른 주소에는 값을 넣는 코드가 존재하지 않았습니다

따라서 윗 부분을 보니 



0x8F9 ~ 0x8FC 코드를 보면 

r30 = 0x30

r29 = 0x01

r26 = 0x31

r25 = 0x01

와 같이 레지스터에 값을 집어 넣고

갑자기 X, Z라는 뜬금없는 레지스터가 등장합니다.

이 레지스터는 데이터 영역에 접근하기 위해 사용되는 레지스터로

일반적인 AVR 레지스터의 크기는 1Byte 로

2Byte Address를 사용하는 데이터 메모리에 접근이 불가능 하지만

X,Y,Z 레지스터를 사용하여 접근이 가능합니다


X = r25:r26

Y = r27:r28

Z = r29:r30

으로 묶어져 있는 형태입니다.

따라서 X = 0x131, Z = 0x130이 되고

밑에 있는 반복문은 0x129까지 값을 한칸 Shift 하는 코드가 됩니다.


따라서 우리가 넣는 값은 큐처럼 뒤로 밀려가게 되므로 위에서 구한 값을 거꾸로 넣어야 합니다

따라서 키는 

91109842가 됩니다.


비슷한 문제를 풀고 싶으면 Reversing.KR의 CustomShell을 풀어보는것을 추천합니다.


실제 도어락을 푸는 듯한 경험을 할 수 있었고 다음 CodeGate에서도 이런 행사가 있었으면 좋겠습니다!

'CTF' 카테고리의 다른 글

SSG 2017 Write Up  (0) 2017.06.02
Plaid CTF 2017 Down the Reversing Hole  (0) 2017.04.24
DoubleS1405 Write UP  (0) 2017.04.01
Codegate2017 prequals Writeup  (0) 2017.02.15
H3X0R - Stage1  (0) 2017.01.08

+ Recent posts