시스템 해킹

 1576, 1/79 회원가입  로그인  
   supershop
   Phrack 14-49 문서 내용 중 질문입니다.

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


bof 공부를 하려고 먼저 Phrack 14-49 문서를 읽고 있는데요,
쉘코드 작성을 위해 execve 함수를 분석하는 부분에 대해 의문이 있습니다.

=== execve 함수 호출 부분 ===
0x8000136 <main+6>:     movl   $0x80027b8,0xfffffff8(%ebp)        ; name[0] = "/bin/sh";
0x800013d <main+13>:    movl   $0x0,0xfffffffc(%ebp)                  ; name[1] = NULL;
0x8000144 <main+20>:    pushl  $0x0
0x8000146 <main+22>:    leal   0xfffffff8(%ebp),%eax
0x8000149 <main+25>:    pushl  %eax
0x800014a <main+26>:    movl   0xfffffff8(%ebp),%eax
0x800014d <main+29>:    pushl  %eax
0x800014e <main+30>:    call   0x80002bc <__execve>                 ; execve(name[0], name, NULL);

=== execve 함수 내부에서 커널 모드 진입 부분 ===
0x80002bf <__execve+3>: pushl  %ebx
0x80002c0 <__execve+4>: movl   $0xb,%eax
0x80002c5 <__execve+9>: movl   0x8(%ebp),%ebx
0x80002c8 <__execve+12>:        movl   0xc(%ebp),%ecx
0x80002cb <__execve+15>:        movl   0x10(%ebp),%edx
0x80002ce <__execve+18>:        int    $0x80

위 코드가 어떻게 돌아가는지는 이해가 갔는데, 이를 기반으로 쉘 코드를 작성하는 부분을 설명하는 부분이 이해가 안 갑니다.

a) Have the null terminated string "/bin/sh" somewhere in memory.
b) Have the address of the string "/bin/sh" somewhere in memory
    followed by a null long word.
c) Copy 0xb into the EAX register.
d) Copy the address of the address of the string "/bin/sh" into the
    EBX register.
e) Copy the address of the string "/bin/sh" into the ECX register.
f) Copy the address of the null long word into the EDX register.
g) Execute the int $0x80 instruction.

이 부분에서요, EBX와 ECX 레지스터에 들어가야할 부분이 서로 뒤바뀐 게 아닌가요?
스택 그림 그려놓고 아무리 살펴봐도 저 둘이 뒤바뀐 거 같은데...
제가 틀렸다면 왜 그런건지 자세한 설명 좀 부탁드리겠습니다 (__)

  Hit : 3778     Date : 2011/07/09 04:46



    
W.H. 음... 제가 이해력이 부족한건지 이해를 못하겟네요..

http://www.hackerschool.org/HS_Boards/data/Lib_system/aleph.txt

이게 한글 번역본인데 이거 한번 보세요

아 이해했네요

d) 문자열 "/bin/sh"의 주소의 주소를 EBX 레지스터에 복사한다.
e) 문자열 "/bin/sh"의 주소를 ECX 레지스터에 복사한다.
이고

소스에선

0x80002c5 <__execve+9>: movl 0x8(%ebp),%ebx

"/bin/sh"의 주소를 EBX로 복사한다.

0x80002c8 <__execve+12>: movl 0xc(%ebp),%ecx

name[]의 주소를 ECX로 복사한다.

인데

/bin/sh 가 0x00010000에 있다고 하고

0x10101010에 0x00010000란 값있으면

아규먼트에는 그 0x00010000이란 값이 아니라 0x00010000을 가리키고 있는 0x10101010이 들어가야 하는겁니다.

그래서

d) 문자열 "/bin/sh"의 주소의 주소를 EBX 레지스터에 복사한다.

입니다.
2011/07/12  
supershop 답변 감사합니다. 제가 이상하게 여겼던 것은 스택을 그려가며 분석을 해보면 /bin/sh의 주소의 주소는 ECX에 저장되고 /bin/sh의 주소는 EBX에 저장이 되기 때문입니다.
그리고 저 a)~g) 다음에 보면,

movl string_addr,string_addr_addr
movb $0x0,null_byte_addr
movl $0x0,null_addr
movl $0xb,%eax
movl string_addr,%ebx ; /bin/sh의 주소를 EBX에 복사
leal string_addr,%ecx ; /bin/sh의 주소의 주소를 ECX에 복사
leal null_string,%edx
int $0x80
movl $0x1, %eax
movl $0x0, %ebx
int $0x80
/bin/sh string goes here.

처럼 d)와 e)랑 아귀가 맞지 않습니다.
이를 저자가 실수로 d)와 e)를 잘못 쓴것이 아닌가요?
2011/07/12