zj3t

email: euntaejang@gmail.com

Latest Posts
요즘 파이썬을 통해서 CTF를 풀며 파이썬을 하나씩 배우고 있는데요

nc를 이용해 서버로 답을 보내는 게 파이썬으로 해보니 훨씬 간단해서 간단히 서버로 데이터를 보내고 받는 것을 포스팅해보도록 하겠습니다.

from socket import *
import threading
import time

ip="서버 주소"
port=서버 포트
value1=""
value2=""
value3=""

def send_server(s, value):
   s.send(value)

s=socket(AF_INET,SOCK_STREAM)  #서버와 소통할 소켓을 만드는 과정
s.connect((ip,port))

print s.recv(2048)   #서버에서 데이터를 가져온다.(예를 들어 "1번답을 입력하세요: ")
time.sleep(3)  #데이터를 표시해야 하므로 약간의 시간을 주어야함
send_server(s,value1)  #값을 서버로 전송
time.sleep(3)
print s.recv(2048)
send_server(s,value2)
time.sleep(3)
print s.recv(2048)
send_server(s,value3)
time.sleep(3)
print s.recv(2048)
time.sleep(3)
print s.recv(2048)

아주 간단하지만 nc 관련 문제를 풀때 이런식으로 소켓프로그래밍을 할 줄안다면 훨씬 편리할 것이라 생각해서 포스팅을 하게 되었습니다.





이번에도 첫번째 섹션에 대한 문제입니다.
코드는 길지만 굉장히 단순한데 요점을 찾지못해서 해맸던 문제입니다.
(실력부족....)






코드는 대략 이런데 help()함수는 일부러 뺏습니다. 문제를 푸는데 아무 영향이 없는 함수이기 때문입니다.

여기서 핵심은 play() 함수입니다.

가만히 잘 들여다보면 /dev/urandom 에서 랜덤값을 가져와 대입을 하는 것을 볼 수가있는데요 저는 이 파일에 취약점이 있을거라 생각하고 제 리눅스로 코드를 복사해 돌려봤는데 랜덤한 값을 패턴을 찾을 수 가 없어서 해매던 중 

lotto[i] == submit[i] 을 비교해서 match를 +1 하는 부분!!!
그리고 이 match가 6이면 성공 플래그를 띄우도록 되어있는데요.

가만히 주목해야할 것이 submit[i]==lotto[i] 가 아니라는 점입니다.  

lotto는 랜덤한 값이 들어갑니다. 따라서 6개의 같은 값이 들어갈 가능성은 아주아주 굉장히 희박한데요 만약 submit에 111111을 넣어주고 lotto 배열에 1이 적어도 하나가 존재한다면 match는 6이 될 것입니다.

자 그렇다면 111111을 넣었을 때 여러번 시도하다 보면 성공이 될까요????

답은 아닙니다. 잘보면 우리가 입력하는 값은 char 이고 lotto 배열에 들어가는 값도 char 입니다. 하지만 %45 부분에서 1~45의 수를 구하는 부분은 10진수 입니다. 

즉 char을 10진수로 바꾼 값 % 45 의 값을 우리가 키보드로 입력이 가능해야한다는 점입니다.

따라서 만약 0,1,2,3,4,5,6,7,8,9 같은 값을 입력한다면 이는 문자 이므로 10진수로는 48~57이고 이를 %45+1한다면 4~13이 됩니다. 하지만 이 값은 우리가 키보드로 입력할 수 없는 값들입니다.(아스키 코드표 참조)

따라서 우리는 !,@,#,$,% 이러한 10진수로 33 부터 시작해서 45보다 작은 수를 넣어주어야 합니다. 

따라서 는 !을 선택해서 넣은 결과 대략 9번정도 끝에 답을 출력 할 수가 있었습니다.



이 문제 역시 첫 번째 섹션에 있는 문제입니다.



여기서 핵심은
1. putenv()로 PATH 환경변수를 바꿈 따라서 절대 경로로 이동을 해야한다.
2. 필터링을 통해 사용할 수 없는 문자열이 있다. 그리고 char** envp를 이용
    => 환경 변수를 이용해야함
3.환경변수를 인자로 주기 위해서 \${환경변수 명}

이것만 알면 된다.
시험기간 때문에 오랫동안 제 공부를 하지못했는데, 감을 되찾기 위해 pwnable.kr문제를 다시 시작했습니다. 점수낮은거 부터 천천히 다시 풀겠습니다.

이 shellshock문제는 shellshock, 쉘의 취약점에 대한 문제였는데요 저도 이제 버퍼오버플로우에 대해 이해했고 여러 취약점들을 몰라서 많은 검색을 했는데 잘 나와있지 않아서 포기하려던 차, http://operatingsystems.tistory.com/80 이 블로그를 발견하고 대략적인 개념과 공격방법을 알 수가있어서 문제를 풀 수가 있었습니다.(shellshock 에 대해 개념이 잡혀있지 않으신 분들은 이 블로그를 참조하는 것이 가장 좋을 것이라 생각합니다.)

자!! 이제 나머지는 문제를 풀면서 설명하겠습니다.

shellshock:
bash 명령어 해석기는 함수를 환경변수에 저장하는 방식을 사용한다. bash에서 한쌍의 중괄호로 묶인 함수안에 코드가 들어가는데, 공격자가 일부 bash code를 이 중괄호 밖에 두면, 시스템이 그 코드를 실행하게 된다. 따라서 시스템 전체가 코드 삽입이라는 공격에 무방비 상태가 되는 것이다.

저 위의 블로그를 참조하면, 밑에서 사용하는 공격 코드를 이해할 수 있습니다.


shellshock.c 파일의 내용입니다. 흠.....딱 봤을때는 이게 뭐지......라고 생각이 들었는데요 
대략적으로는 id를 조작하여 bash -c로 shock_me 를 출력한다. 지금은 이쯤만 알고 나머지는 밑에서 설명하겠습니다.



env x='() { :;}; echo hello' bash -c "bye" 

이 코드를 실행 했을 때 시스템이 shellshock 취약점에 노출되어있다면, 중괄호 밖에있는 hello와 함께 bash -c 에서 실행한 echo bye가 실행 될 것입니다.

bye만 출력되는 것으로 봤을 때 시스템에는 취약점이 패치가 되었나봅니다. 
그렇다면 아마도 저 ./shellshock 파일이 shellshock의 취약점이 나타나도록 하는 프로그램이 아닐까 하는 생각이 들었습니다. 그래서 실행해본 결과 shellshock 파일안에 있는 shock_me또한 출력되는 것을 찾을 수 있었고 파일의 용도를 확신하게 되었습니다.


이렇게 해서 답을 찾을 수가 있었는데요 cat이 아닌 cat의 위치 /bin/cat을 입력해야 cat이  실행이 되더군요.

여기서 아마 왜 bash -c 로 하는 건지 왜 bash에 c옵션을 준거지?? 라고 생각하시는 분이 있을 수 있습니다. 저도 그랬구요.


옵션의 설명은 이런데 감이 안오실 겁니다. 그래서 보여드리도록 하겠습니다.


shell은 echo $SHELL로 출력해 본 결과 bash쉘을 사용하지만 아까와 같이 공격코드를 쓸 때 bash를 쓰면 에러가 발생합니다. 위는 제가 해본 그 예입니다.!!!

모르는 것이있거나 틀린부분이 있으면 언제든지 글이나 메일 부탁드립니다.



오랫만에 들어왔고 포스팅도 없는데 이렇게 많이 들어와주셔서 감사합니다.

약 1년전에 블로그를 만들었을 때는 하루에 많아야 3명 4명이였는데 지금은 포스팅이 없어도 많이들 들어와 주셔서 공부가 재밌어지고 있습니다.

시험기간이라 따로 제 공부를 하지못해서 포스팅이없는데도 많이 메일도 보내주시고 해서 열심히 공부하고 싶어졌습니다.

시험이 내일 끝나는데 낼부터 공부한 자료를 많이 올려보도록 하겠습니다.

감사합니다.
근 한달만에 글을 쓰네요.

그런데도 조회수는 꾸준히 늘고있어 감사드립니다.

요즘에는 취약점을 한번 찾아보고 싶어 원데이문서랑 ROP 공부를 하고있습니다.

로퍼사우르스라는 문제가 있는데 ROP의 정석문제라고 불려 풀어봤는데 이해하기 너무 힘들었습니다.

취약점 관련 공부를 하고있다보니 포스팅에 쓸 내용이 없어요...

다음 포스팅에 로퍼사우르스 문제의 포스팅을 해보도록하겠습니다.

감사합니다.
코드를 굉장히 막짜서 보시기엔 어려움이 있으실텐데 어떻게 짜는지만 보시면 될꺼같아요 변수도 다 PE 정보의 이름이라서요.

비쥬얼 스튜디오에서 함수를 제공해주는거 같은데(확실하지않음)

저는 제가 다 구조체로 짜서 코드가 2500줄 가까이 나온거 같아요.

코드가 반복되는게 많아 다 복붙으로 하다보니 코드가 길어졌는데, 함수로 만들면 1천줄안에 만들수 있을 것같아요

패커제작에서는 최소한의 코드로 만들어 보겠습니다.

질문은 언제든 감사합니다~~~

다운로드
https://drive.google.com/file/d/0B9mSiiTEByfodTNUSmxmN1hlZEk/view?usp=sharing
매일 조금씩 만들다 오늘 완성했습니다.

테스트를 몇번해보니 저한테는 완벽했는데 다른분들도 아마 완벽하게 나올것이라 생각합니다.

일단 모티브가 PEView라는 유명한 PE를 보여주는 프로그램인데 비슷하지만 약간 좀 다르게 만들었습니다.

소스는 다음 포스팅에서 공개하겠습니다.






파일 다운로드: