시스템 해킹

 1576, 1/79 회원가입  로그인  
   hara0115
   대학교 레벨에서 BOF 무임승차 문제

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=1465 [복사]


무임승차 문제 읽어보고 이해는 다 가는데요..

왜 실행하니까 저는 비밀번호 통과가 안되는거죠?

password[20]에서 password가 배열의 시작 주소고 auth가 그 주소보다 20 더 큰 주소라서

20byte보다 큰 문자열 입력하면 auth의 값이 0이 아닌 다른 값으로 변하므로

if절에서 통과하셨습니다 뜨는건데... 저는 그러케 안나와요

맥북쓰고 있는데 인증 실패, Abort trap

이러케 뜨네요.. 뭐 쉬운거긴 한데 왜 제 컴에선 이게 안되는지??

답변좀 해주세요!!

  Hit : 4378     Date : 2011/01/11 08:09



    
ruka270 gcc가 3.x대가 아니라서 그럴지도...
ftz에서 실험해보세요.
2011/01/11  
helloman 저밑에 어느분이 올려주신 코드 그거 말씀하시는거 같은데
password변수는 auth변수보다 낮은 주소에 자리잡고 있어요
스택은 높은 주소에서 낮은주소로 데이터가쌓이거든요.
하지만 스택내에 선언된 변수영역안에 데이터가 들어갈땐 다시 낮으주소에서높은주소로
들어가게되어 높은주소에 자리잡고 이쓴 다른 변수영역을 덮어쓰게 되는 겁니다.
잘못 이해하신 부분은 다시 정정하고 넘어가세용
2011/01/11  
helloman 님 시스템 환경이 어떤지 몰라 왜그런지는 확인을 해보기전엔 모르겠네요.
그나저나 오오저도 맥북 써보고 싶어요...+_+
2011/01/11  
hara0115 제가 메모리 주소를 체크해봤는데요

문제가 auth가 password보다 먼저 선언됬는데도 낮은 메모리 주소를 가지고 있네요?

왜이러죠?ㅜㅜ

또 다른 프로그램에서 char target[4]= "dog";와 char buffer[20] = {0, };이렇게 선언하고 초기화 했는데
target이 buffer보다 더 낮은 주소를 가지네요 ㅜㅜ 근데 또 char target[20] = "dog";이렇게 하면
target이 더 높은 주소를 가지고 ㅜㅜ

target이 항상 높은 주소를 가져야 하는데 ㅜㅜ char배열의 크기에 따라서 왜 주소가 buffer보다 낮은 경우도 생기는지 ㅜ

이 것좀 해결해주세요!!
2011/01/11  
helloman 혹시 설치하신 os버젼이 어떻게 되는지 알수 있겠습니까?
디버깅했더니 변수 선언 부분이
0x08048364 <main+28>: movl $0x1,0xfffffffc(%ebp)
0x0804836b <main+35>: mov 0x804842c,%eax
0x08048370 <main+40>: mov %eax,0xfffffff8(%ebp)
이런 스타일로 보이던가요?
a = 1, b = "aa" 이렇게 선언하고 컴파일후 디버깅 한 내용입니다.
0xfffffffc(%ebp) 이 a변수이고
0xfffffff8(%ebp) 이 b변수입니다.
뒤에 붙어있는 (%ebp)보이시죠?
저걸 기준으로 보여주고 있는 겁니다. 자 따라해 보세요.
(gdb) x $ebp+0xfffffffc
0xbff29f74: 0x0804837c
(gdb) x $ebp+0xfffffff8
0xbff29f70: 0x006cbca0

0xbff29f74 <--이게 a , 0xbff29f70 <--요건 b가 되겠습니다.
이제 a가 b보다 상위주소에 자리 잡고 있다는걸 확인 하셨습니다.


자그럼 메모리의 구조를 확인 해보겠습니다.
| TEXT | DATA | STACK |
low ----> ----> <---- high
요런 방향으로 각영역마다 데이터가 쌓이고 있습니다.
자 그럼 변수 a,b를 선언하게 되면 스택에는 이런 모양으로 데이터가 쌓이게 됩니다.
[ b ][ a ][ sfp ][ ret ]
low <-------------------- high
화살표 방향으로스택에 값을 집어 넣게 됩니다.
한가지 경우를 더확인 해봅시다. 이번에는 b변수를 배열로 선언해보겠습니다.
char a
char b[4]
[ b x 4 ][ a ][ sfp ][ ret ]
<--------------------------
b의 크기가 <---- 방향으로 스택이 쌓이는 방향으로 늘어나게 됩니다.
이때 b에 "abcd"란값을 넣는다면 b변수의 앞에서부터 하나씩 들어가겠죠
변수 b에는 이런 화살표 방향으로 값이 들어갑니다.
[a b c d ][ a ][ sfp ][ ret ]
------>
이렇게 해서 높은주소에 있는 변수나 sfp , ret값을 덮어써서 오버플로우 공격을 할 수 있는 거에요.
이해 되시나요?
2011/01/12  
helloman 이해 하셨으면 쪽지를 보내주세요 계좌 번호 보내드릴태니 양심것 입금 하시면 됩니다. 2011/01/12  
daydreamss helloman // 정말 이해하기 좋게 설명하셨네요~! 설명 잘봤습니다 2011/01/12  
daydreamss 그런데 hara 님이 말씀하신건 왜 배열 선언 방식에따라 지역변수 위치가 바뀌냐는것인데
저건 컴파일러가 컴파일하는 방식때문이 아닐까요?

char buffer[20] = {0, };

처럼 선언하면 컴파일러가 이 배열이 넘칠지도 모른다고 판단하여
임의로 위치를 바꾼것 아닐까싶네요
2011/01/12