22018, 1/1101 회원가입  로그인  
   sllwoo
   http://fjklsdk@fjklsdjflk;a
   segmentation_fault.png (70.0 KB), Download : 99     [오른쪽 버튼 눌러 다운 받기]
   ftz level11에서 sementation fault오류뜨네요...

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



셸코드랑 ret값 입력 잘된거 같은데 왜이러죠..?ㅠ

  Hit : 11954     Date : 2015/01/23 11:54



    
skyclad1975 보통 4바이트 단위로 메모리가 할당될텐데 243바이트라니 조금 이상하네요.
확인해보고 답변드리겠습니다.
2015/01/24  
skyclad1975 GDB로 열어서 확인해본 결과

0x08048473 <main+3>: sub esp,0x108

이런 부분과

0x08048499 <main+41>: lea eax,[ebp-264]
0x0804849f <main+47>: push eax
0x080484a0 <main+48>: call 0x804835c <strcpy>

이런 부분이 있었습니다.
스택에서 총 0x108, 즉 264바이트만큼을 할당하였으며,
str 문자열의 시작주소는 ebp-264라고 볼수 있겠습니다.

애초에 str 문자열이 256바이트짜리이니, 최소한 256바이트 이상, Dummy 값이나 SFP까지 포함해서 264바이트정도는 넣어야 하지 않나 싶네요.

실제로 ./attackme `python -c 'print "a"*263'`
이렇게 실행했을 때에는 정상적으로 동작하였습니다.
아직 리턴 어드레스를 침범하지 않았다는 뜻이죠.
그리고 기본적으로 문자열은 문자열의 끝을 나타내기 위해 끝에 자동적으로 '\0' 으로 널 문자가 붙는다는것도 생각하고 시도하셔야 합니다.
2015/01/24  
skyclad1975 ./attackme `python -c 'print "a"*267'`
여기까지 되고,
./attackme `python -c 'print "a"*268'`
여기부터 안 되는걸 보니 여기부터가 리턴 어드레스인 모양이네요.

쉘코드가 24바이트+4바이트짜리 같은데 앞의 24바이트를 243바이트에 더하면 267바이트가 됩니다.
뒤의 4바이트를 주소로써 리턴 어드레스에 덮어씌워야 한다면 243바이트가 아니라 244바이트를 넣어야 하는게 아닐지요.
2015/01/24