22018, 1/1101 회원가입  로그인  
   6월
   BufferOverFlow를 공부하고 있는데요. 커널의 방어기법때문인지 제 실력때문인지 안됩니다.

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


CentOS 6.3 버전으로 공부하고 있습니다.

커널은 uname 결과 2.6.32-279 같네요


#include <stdio.h>

int main()
{
     int access=0;
     char pass[40];

     printf("input password : ");
     scanf("%s", pass);

     if(pass == "totoro"); // 어차피 bof 니까 아무래도 상관 없으니까
     {
         access ++;
     }

     if(access==1);
     {
         printf("Access!!!\n");
     }
     else
     {
         printf("Fail!!!\n");
     }
     return 0;
}


이게 코드고요.


리버싱 내용은 간략히 설명해드리자면

0x08048472 에서 scanf를 콜해갑니다.
s를 누르긴 했는데 n하고 s 하고 차이가 없네용 ;;

여기서 1111111111로 스택을 채워보면

esp 는 0xbffff2a0 이고 ebp 는 0xbffff2e8 입니다.

4 * 13 Byte 차이 인거죠.

그래서 다음에 재 disassemble 을 합니다.



제가 가고싶은 리턴주소는 printf("Access!!!\n"); 로 가고 싶단 말입니다.

cmp jne 바로다음의 주소는 0x0804847f 에 있고 여기부분이 Access!!를 출력하는 부분이 맞습니다.

scanf에서 스택에 1111111111111111111111 로 ebp까지 채우고

그 다음 4바이트에
\x7f\x84\x04\x08 이라고 넣었는데 틀렷나요?

도저히 안되네요.



버퍼오버플로우는 쥐똥도 모르는 놈이군!

하지 마시고

커널의 방어기법때문인지 제 잘못인지 알려주세요 ㅠㅠ

방어가 제가 공부하기에 너무 쎄서 그런지도 모르겠네요.

근데 CANARY 값도 변경되었을 텐데 프로그램이 안튕기네요 ;;

  Hit : 9753     Date : 2013/04/09 12:01



    
cd80 우선 되는지만 확인하시려면 0x0804847f를 50번정도 넣어보시면 됩니다
센토스 6.3에서 기본설정으로 스택가드가 설정이 돼있는지 안돼있는지는 모르겠지만
스택가드가 없다면 성공하지 않을까 싶습니다
2013/04/09  
6월 아!!!!! 그런 방법이!! ㅋㅋㅋㅋㅋ 감사합니닷!!
왜 전부 1로 채울 방법만 생각했을 까요...
근데.. 안되네요. 아 gdb 사용법 잘 모르겠네요.
다음 넘기는게 n 함수 내부로 들어가는게 s 아닌가요?
2013/04/10  
cd80 si입니다~~
s만 누르시면 현재 함수가 끝날때까지 한단계씩 실행한단거 같네요
(gdb) s
Single stepping until exit from function main,
which has no line number information.

원하시는 명령은 si입니다
2013/04/10  
6월 감사합니당~~~
해보고 말씀드리겠습니다
2013/04/13