티스토리 뷰

이런... 벌 받았나 봅니다....

후.... 아무래도 이 전 글인 보호 글의 내용 때문에요 ㅠㅠ...(매우 쉬운 비밀번호 ㅎㅎ)

어쨋든 6번 가봅시다 !

일단 소스는 위와 같습니다.( 더 있긴한데 너무 길어져서... 어차피 푸실테니 ㅎㅎ) 먼저 분석 해보세요 !

소스코드 자체는 별로 어렵지 않다는 걸 알 수 있죠 ???

근데 문제는 strncpy <- 이놈 입니다... 보통 보안 코딩쪽으로 볼 때 많이 보이는 녀석...

strcpy의 대체자 녀석 입니다. 이 녀석 때문에 또 별 쇼를 다했네요...;;

한 2시간 40~50분 뻘 짓 하다가 아무래도 안되겠어서(어디서 들어 본적이 있는 것 같아서) strncpy에 대해서 찾아봤습니다.

그렇게 찾다가 이곳을 발견 했습니다 ! 와!!!!!!!!!!!!!! strncpy 에 이런 취약점(?)이 있었다니... 제가 이거 전에도 엄청나게 많은 분석을 했었는데 보시면 아시겠지만, user.name 과 user.password가 붙어 있습니다.

저 곳에서 취약점이 딱! 나타나는 거죠 ! 한 번 살펴볼까요 ?

BreakPoint는 main 함수의 if 부분에 걸었습니다.

저 위의 문장대로 인자를 전달하고 실행시키더라도 프로그램이 종료되지 않습니다. 원래의 strncpy라면 종료되는데 말이죠 !

제가 딱 이 부분까지 발견했을 때, '아... 다 했다 ~~~ !' 였는데 그 담음 또 막힌 부분이 있었습니다.

모두 0으로 초기화 했고.... 미처 눈치 채지 못하셨겠지만(저만 그럴수도...), 구조체에는 int 형 변수가 하나 더 있었다는 겁니다 !

이 때문에 다음은 0으로 채워져서 그 이상은 넘어가지 못했습니다. 첫 번째 인자는 40개 꽉 채울 수 있지만 두 번째 인자는 32개에서 멈추게 되는 겁니다. 그래도 눈을 돌린 곳이 greetuser() 입니다.

greetuser로 넘어가는 값은 위의 파이썬 코드대로 했을 때, A*40+B*26 일 겁니다.(A가 NULL을 찾을 때 까지 값을 입력 받으니까요.)

그리하여 다시 BreakPoint를 걸고 도전 했습니다.

greetuser() 의 맨 마지막 printf(puts로 표시 됨.) 에 BreakPoint 를 걸고 문자열을 전달할 수 있는 최대 크기로 전달 해봤습니다.

사실은 이렇게 쉽게 설명하지만 이 과정 중간에는 엄청난 노가다가 있었습니다. 이것도 계속 잡고 있었어요 왜 안되나...

그 결과 ! 

제가 전달한 문자열의 길이와 getenv("LANG")에서 얻어진 "HI " 를 합쳐도 ebp를 모두 덮을 수 없었던 겁니다.

그리하야 export LANG="fr" 을 넣어주고 다시 실행시켜 봤습니다.(물론 늘어난 문자열 만큼 조정해서 인자 수를 줄였습니다.)

드디어 ebp를 덮고도 더 쓸 수 있는 공간을 마련했습니다... 이제 공격만 하면 되겠죠? 지금 여기까지는 제 리눅스 서버에서 했기 때문에 위의 과정을 똑같이 하시면 됩니다.(SmashTheStack이 제공하는 서버와 구성이 같다면 그냥 해도되요 ~~)

다행히 전 그냥 같은 방식으로 공격했는데도 먹혔습니다 ^^.

답은, u1zqhnHEzaKmzK09Um 입니다 !


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함