시스템 해킹

 1576, 1/79 회원가입  로그인  
   morieye
   도와주세요 대학교수님들한테 물어봐도 이상하게 답변해주세요 ㅠ.

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


제가 궁금한것이 2가지 있습니다.

첫번째는
level13


환경변수에 NOP값이 앞에 16개 이상이 들어가야지만 세그먼트폴트가 나오지않는데 왜 그런지 이유를 모르겠습니다. 자세하게 설명해주시면 감사하겠습니다.  


두번째는
level15



제가 맨처음에는 환경변수로 공격을해보려고 python -c 'print "\xef\xbe\xad\xde"' 이런식으로 shell이라는 환경변수의 값에 python을 이용하여 값을넣었습니다
이 환경변수의 주소값은 0xbfffff2c이고요.


그래서 제가 (python -c 'print "A"*40 + "\x2c\xff\xff\xbf"'; cat) | ./attack 를 입력하여공격을 해보았지만 실패를 하였습니다.
그래서 혹시몰라 다시 환경변수에 python -c 'print "\xde\xad\xbe\ef"' 반대로 값을 넣고 저장해보고 똫같은 방식으로 공격을 해보았습니다만 역시나 실패하였습니다.

그래서 그냥 main함수안에있는 deadbeef의 값을 가지고있는 주소값인 0x080484b2를 이용하여
(python -c 'print "A"*40 + "\xb2\x84\x04\x08"'; cat) | ./attackme를 하니 성공을 하였습니다.

똫같이 deadbeef가 있는 주소값을 넣어주었는데 왜 첫번째 방법은 안되고 두번째 방법은 통하는지 모르겠습니다.


제가 해킹보안학과에 올해 신입생으로 들어갔습니다. 그런데 시스템해킹은 아직 안배우는것이니 지금물어보면 차단먹인다고 하네요 어떻게해야하나요;;

  Hit : 3367     Date : 2017/03/14 10:56



    
해쿨러 1. 환경변수에 쉘코드를 넣을떄 NOP가 16개 이상 필요한 경우
환경변수의 주소를 어떻게 찾아내셨는지, GDB로 보셨는지 아니면 에그쉘을 사용해 에그쉘에서 출력하는값을 사용하셨는지 모르겠는데
스택에 맨끝에 보면 0xc0000000 직전에 프로그램 이름이 들어갑니다
그 아래 주소에 들어가는 것들, 예를 들어 환경변수의 시작 주소도 프로그램 이름의 길이에 영향을 받습니다
만약 gdb로 환경변수 주소를 찾으신다음에 쉘에서 공격하신 거라면 gdb에서는 절대경로로 실행하기 떄문에
/tmp/attack/this 이런식으로 스택 맨끝에 들어가게 되고, 16글자
쉘에서 만약 상대경로로 하셨다면
./this 로 실행하면 6글자
이렇게 되면 환경변수의 시작점이 gdb에서와 쉘에서 10바이트가 차이나게 됩니다

환경변수를 사용하지 않는 경우에서도 이런 유사한 경우가 생기는데
지역변수에 쉘코드를 넣고 지역변수로 리턴하는 경우 쉘코드의 끝과 ret사이의 거리가 16바이트가 필요합니다(\x31\xc0으로 시작하는 혹은 \x6a\x0b로 시작하는 23바이트 혹은 25바이트짜리 쉘코드 기준)

2. 이것도 1번과 마찬가지 문제입니다. gdb에서 봤을땐 0xbfffff2c였을지 몰라도 쉘에서 실행할때는 0xbfffff34일수도 있습니다

이런식의 혼란을 방지하기 위해선 쉘에서 공격하실때 프로그램의 절대경로를 사용해 실행하시면 gdb와 같은 스택이 생깁니다
그리고 앞으로 이런식으로 그냥 여러번 시도하는것만으로는 문제를 파악하기 어려워 지는데, 시도하는것만 아니라 디버거로 분석하는 습관을 잘 들이셔야 합니다
안되면 무조건 gdb부터 바로 켜서 하나하나 트레이스 해나가시면 혼자서도 많은 문제를 해결할 수 있습니다
2017/03/15