HawkIS

HawkIS CTF Addition Hero Write-up

WoonJu 2023. 5. 9. 22:27

이번 과제는 동아리 HawkIS CTF 풀기다.

Addition Hero 라는 덧셈 문제인데, 200개의 연산 문제가 있다.

 

문제 파일을 다운 받으면 보이는 소스코드이다.

 

C코드인데, rand 함수로 6자리의 숫자를 덧셈을 한다는 뜻같다.

 

IP : 49.172.228.35

Port : 1234

 

위의 주소로 netcat을 이용하여 접속한다.

(Linux 환경 : Ubuntu 22.04 LTS-64x)

접속 방법 :  nc host port

 

접속하면 보이는 화면이다.

TEST [1] 부터 [200] 까지 풀어야하는 것이당...

 

pwntools라는 툴을 이용하여 연산을 한번에 끝내고 flag를 얻어보려고 한다.

먼저 pwntools를 다운받는다.

 

밑의 링크 참조하여 python3와 pwntools를 설치하였다.

https://0netw0m1ra.tistory.com/263

 

[ubuntu-22.04] pwnable 세팅(vim, pwntools, pwndbg, checksec, gcc)

[환경] [vim 설치] $ sudo apt-get install vim [python3 설치] $ sudo apt update $ sudo apt install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential $ sudo python3 -m pip install --upgrade pip [pwntools 설치] $ sudo python3 -m

0netw0m1ra.tistory.com

 

 

apt-get update
apt-get install python3 python3-pip python3-dev libssl-dev libffi-dev build-essential
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade pwntools

 

 

설치 완료.

 

 

처음 접하는 툴이기에 사용법과 예제 위주로 구글링 하였다.

https://foxtrotin.tistory.com/290

 

pwntool을 이용한 문제 풀이

pwntool 기본 사용법: foxtrotin.tistory.com/289 덧셈 문제 실행하면 20개 문제를 풀라는 문장과 함께 문제가 시작된다 기본 사용법 글에서 다뤘던 것처럼 풀면 된다 #!/usr/bin/env python from pwn import * r=remote("

foxtrotin.tistory.com

이 링크는 소스코드 작성을 위해 참고한 블로그이다.

 

 

vi python3.py #(파일 생성 후 편집)

먼저 위의 명령어로 python3.py라는 파일을 만들어서 코드를 작성한다.

(코드 작성 시, i나 insert 키로 작성, 수정)

 

 

소스 코드를 작성하였다. 

readonly 옵션에서 아래와 같은 명령어를 입력하면 각 줄의 넘버를 볼 수 있다.

:set nu

 

 

[[코드 설명]]

먼저, from pwn improt * 는 코드 맨 위에 작성하는 것으로, pwn 모듈을 임포트 한다.

from pwn import *

 

다음엔 pwntools 연결을 하는데, remote는 '접속주소', 포트 (string, int)형식으로 서버에 연결한다.(실행)

p = process("./test") 방식은 로컬로 연결하는 것이다.

r = remote("49.172.228.35" ,1234)

 

range():  함수는 특정 구간의 숫자의 범위를 만들어주는 함수이다.

이 함수는 특정 횟수만큼 반복하는 반복문을 만들기에 유용하다.

연산문제 200를 반복해야하기 때문에 200을 넣어주었다.

for i in range(200):

 

아래 코드는 ': ['라는 문자열을 읽는다는 뜻이다.

쉽게 말하면 특수문자는 보지않고 숫자만 본다는 것이다.

r.recvuntil(': [')

여기 문제에서 TEST [1] : [  까지 읽는다.

 

여기서부터는 변수를 지정하여 코드를 인식한다.

첫 번째 대괄호 숫자를 first 숫자로 변수를 지정해주고 첫 번째 숫자를 닫는 대괄호까지 지정해준다.

(']') [:-1]의 의미는 대괄호 이전의 숫자를 가리킨다.

first = r.recvuntil(']')[:-1]

 

이 코드도 마찬가지로 첫 번째 숫자를 닫는 대괄호부터 plus 문자와 두 번째 숫자 대괄호까지 읽는 코드이다.

대괄호 '까지' 읽는 코드이기에 plus 문자는 생략해주었다.

r.recvuntil('[')

 

first로 받은 변수 값을 int로 변환하여 a에 다시 한번 저장한다는 뜻이다.

(굳이 이렇게 안해도 되는데 이렇게 했다...)

a = int(first)

 

second 변수는 두 번째 대괄호 숫자다.

이것도 마찬가지로 두 번째 대괄호를 닫기 전까지의 숫자를 인식하는 것이다.

second = r.recvuntil(']')[:-1]

 

second로 받는 변수 값을 int로 변환하여 b에 다시 한번 저장한다.

b = int(second)

 

이제 연산 값을 프린트 하는 코드부분이다.

res는 첫 번째 숫자와 두 번째 숫자를 더한 값이다.

print()를 통해 a + b 숫자를 출력한다.

r.sendline(str(res))는 str의 res 데이터 값을 전송한다는 뜻이다.

res = a + b    #res = int(frist) + int(second)라고 해도 됨.
print(res)
r.sendline(str(res))

 

마지막 코드는 입출력 제어를 넘겨 받는 것으로, 직접 화면에 출력할 수 있게 한다.

r.interative()

 

vi를 종료 후, 이 명령어를 이용해 파일을 실행시킨다.

:wq   #파일 작성 저장 후 종료
phthon3 python3.py

 

실행 시킨 화면이다.

각 줄의 코드를 인식하여 실행한다.

 

print() 함수로 인해 연산값이 계속 나오게 된다.

 

코드에 print함수를 빼주면 연산 과정 없이 바로 flag가 나온다.

> print 빼줌

 

그리고 flag가 나왔다!

 

flag is hawkis{s0lv3_sm4rtly_or_repeated_w0rk}