HawkIS CTF Addition Hero Write-up
이번 과제는 동아리 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}