시스템 해킹

 1576, 1/79 회원가입  로그인  
   SmileBedge
   쉘코드 세그먼트오류;;

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


운영체제는 레드헷9 2.4xxx입니다

일단 기계어 "\xe8\xdd\xff\xff\xff\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x00\x90\x55\x89\xe5\x56"
"\xba\x0b\x00\x00\x00\x59\xbb\x01\x00\x00\x00\xb8\x04\x00\x00\x00\xcd\x80\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80"

를

code[] = "" 넣고

인터넷에 돌고있던 코드 두가지
1.
int main()
{
        int *run;
  
           run = (int *)&run+2;
           (*run) = (int) code;

    return 0;
}
2.
int main()
{
  void (*rub)(void);
        run = (void *)code;
        run();

      return 0;
}
으로 돌려볼경우 세그먼트오류가나네요...

제가 어디서 잘못한걸까요...

  Hit : 4054     Date : 2011/07/29 10:21



    
늅늅 \00때문에 그런거 아닐까요 \00이 상당히 많이 들어가네요 2011/07/29  
W.H. \x00 이 쉘코드에 있으면 제대로 실행 않되요 2011/07/30  
pwn3r ㄴ NULL이 필요한코드에 NULL을 없애면 실행자체가 안되요 ~

디스어셈블해보니 Hello World를 출력하시려던거같으신데 FTZ기준으로 첫번째 쉘코드의 시작부분이 이상하네요

0x08049440 <code+0>: call 0x8049422 <data_start+2> // 요기이상

0x08049445 <code+5>: dec %eax // "Hello World"
0x08049446 <code+6>: gs // "Hello World"
0x08049447 <code+7>: insb (%dx),%es:(%edi)// "Hello World"
0x08049448 <code+8>: insb (%dx),%es:(%edi)// "Hello World"
0x08049449 <code+9>: outsl %ds:(%esi),(%dx)// "Hello World"
0x0804944a <code+10>: and %dl,0x6f(%edi)// "Hello World"
0x0804944d <code+13>: jb 0x80494bb <_DYNAMIC+67>// "Hello World"
0x0804944f <code+15>: add %dl,%fs:0x56e58955(%eax)// "Hello World"
0x08049456 <code+22>: mov $0xb,%edx // 11글자
0x0804945b <code+27>: pop %ecx // "Hello World" 뽑아내기
0x0804945c <code+28>: mov $0x1,%ebx // stdout
0x08049461 <code+33>: mov $0x4,%eax // write
0x08049466 <code+38>: int $0x80 // 0x80 inturrupt
0x08049468 <code+40>: mov $0x1,%eax // exit
0x0804946d <code+45>: mov $0x0,%ebx // 0
0x08049472 <code+50>: int $0x80 // 0x80 inturrupt

디스어셈블한 코드중 code+0부분의 바이트코드가 \xe8\xdd\xff\xff\xff인데 , code+5와 code+22의 offset은 0x11이에요. (code + 5 ~ code + 21은 "Hello World")
그래서 \xe8\x11\x00\x00\x00 로 바꿔주시면 잘됩니다 :)



인증샷

[guest@ftz guest]$ cat pwn3r.c
http://www.hackerschool.org/HS_Boards/skin/guta_green/cw_write.gif
char code2[] = "\xe8\x11\x00\x00\x00\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x00\x90\x55\x89\xe5\x56"
"\xba\x0b\x00\x00\x00\x59\xbb\x01\x00\x00\x00\xb8\x04\x00\x00\x00\xcd\x80\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80";
int main()
{
int *run;

run = (int *)&run+2;
(*run) = (int) code2;

return 0;
}

[guest@ftz guest]$ ./pwn3r
Hello World[guest@ftz guest]$
2011/07/30