A Hacker Next Door

[CBM CTF 2019 Write-up] Reverse – Hashish

Category: Write-up
Tag: CTF
문제 설명

hashish 문제 다운로드


readme.txt:

Hi  
My friend made a hash algo which he thought was irreversible….however he was on Manali Cream[hashish ;-)].  
so he print something he should not print while making hashes.  
Below is the output of given binary with flag as input… get the flag.  

hash-0 : 138
hash-1 : 512
hash-2 : 1645
hash-3 : 5034
hash-4 : 15218
hash-5 : 45756
hash-6 : 137391
hash-7 : 412292
hash-8 : 1236927
hash-9 : 3710845
hash-10 : 11132642
hash-11 : 33398021
hash-12 : 100194167
hash-13 : 300582553
hash-14 : 901747774
hash-15 : 2705243426
hash-16 : 8115730373
hash-17 : 24347191171
hash-18 : 73041573621
hash-19 : 219124720917
hash-20 : 657374162799
hash-21 : 1972122488522
hash-22 : 5916367465576

풀이

문자열의 길이를 N이라고 했을 때(1부터 셈), “hash-N”에서 N의 길이는 입력으로 오는 문자열의 길이보다 하나 크다. hash-(N-1)의 숫자는 문자열의 N번째 문자의 아스키코드가 1씩 증가함에 따라 1씩 증가한다. 그래서 이런 원리를 이용해서 한문자씩 맞는 문자를 찾아내었다.

찾아내기 위해 다음과 같은 코드를 작성했다:

a2z.cpp ; 이 코드는 커맨드라인 아규먼트로 입력받는 문자열과, 입력받는 숫자에 해당하는 문자를 결합한 문자열을 출력해주는 코드다.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	char str[] = "!^#$%&*()+-_,./\\<>:;=?@~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

	printf("%s", argv[1]);	
	printf("%c", str[atoi(argv[2])]);

	return 0;
}

a2z.sh ; 이 코드는 위의 a2z.cpp 코드와 파이프라인 을 이용한 명령어를 87번 반복해서 실행하기 위해서 만들어진 배쉬 쉘 스크립트 코드이다.

#!/bin/bash

for ((i=0; i<87; i++)); do
	echo
	echo $i
	./a2z cbmctf{w3@k_h4sh_4l60} $i | ./hashish
done

이제 이 두개의 코드를 이용해 다음의 명령어를 순서대로 입력해서 한 문자씩 찾아낸다 :

vi a2z.sh       -> 스크립트 파일을 열어서 지금까지 발견한 문자열로 대체한다.
bash a2z.sh > a2z_result.txt        -> a2z.sh를 실행한 결과를 a2z_result.txt에 저장한다.
grep -n 5916367465576 a2z_result.txt       -> grep 명령어에 N-1번째의 숫자를 삽입해 결과 텍스트 파일의 몇번째 줄에 해당 숫자가 있는지 알아낸다.
vi a2z_result.txt       -> a2z_result.txt를 연다
: set number        -> vim에서 줄 수를 알려주는 명령을 이용해 해당 숫자가 몇번째 줄에 있고, 그래서 어떤 문자인지 알아낸다.
./hashish       -> hashish 파일을 실행시켜 결과가 정말 맞는지 확인한다.

a2z_result.txt에서 어떤 문자인지 알아낼 때는 !^#$%&*()+-_,./\<>:;=?@{}(24) ABCDEFGHIJKLMNOPQRSTUVWXYZ(50) abcdefghijklmnopqrstuvwxyz(76) 0123456789(86) 를 참고 한다. 특수문자는 0~24, 영어 대문자는 ~50, 소문자는 ~76, 숫자는 ~86까지.


flag

flag is : cbmctf{w3@k_h4sh_4l60}

$ ./hashish
enter the string
cbmctf{w3@k_h4sh_4l60}
hash-0 : 138
hash-1 : 512
hash-2 : 1645
hash-3 : 5034
hash-4 : 15218
hash-5 : 45756
hash-6 : 137391
hash-7 : 412292
hash-8 : 1236927
hash-9 : 3710845
hash-10 : 11132642
hash-11 : 33398021
hash-12 : 100194167
hash-13 : 300582553
hash-14 : 901747774
hash-15 : 2705243426
hash-16 : 8115730373
hash-17 : 24347191171
hash-18 : 73041573621
hash-19 : 219124720917
hash-20 : 657374162799
hash-21 : 1972122488522
hash-22 : 5916367465576
▲top