2012-04-18 4 views
0

저는 i386 : x86_64에서 작업 중이며 쉘을 시작하는 간단한 프로그램을 작성하고 있습니다. 벨로우가 내 어셈블리 야.세그먼트 결함 어셈블리 i386 : x86_64

.section .data 
.section .text 
.globl _start 

_start: 
    xor %rax, %rax 
    mov $70, %al 
    xor %rbx, %rbx 
    xor %rcx, %rcx 
    int $0x80 

    jmp ender 

starter: 
    pop %rbx 
    xor %rax, %rax 
    mov %al, 0x07(%rbx) 
    mov %rbx, 0x08(%rbx) 
    mov %rax, 0x0c(%rbx) 
    mov $11, %al 
    lea 0x08(%rbx), %rcx 
    lea 0x0c(%rbx), %rdx 
    int $0x80 

ender: 
    call starter 
    .string "/bin/sh" 

문제는 계속 세그먼트 화 오류가 발생한다는 것입니다. 내가 추측을하고 표시된 주소를이라고 말할거야

0000000000400078 <_start>: 
    400078: 48 31 c0    xor %rax,%rax 
    40007b: b0 46     mov $0x46,%al 
    40007d: 48 31 db    xor %rbx,%rbx 
    400080: 48 31 c9    xor %rcx,%rcx 
    400083: cd 80     int $0x80 
    400085: eb 1b     jmp 4000a2 <ender> 

0000000000400087 <starter>: 
    400087: 5b      pop %rbx 
    400088: 48 31 c0    xor %rax,%rax 
    40008b: 88 43 07    mov %al,0x7(%rbx) 
    40008e: 48 89 5b 08    mov %rbx,0x8(%rbx) 
    400092: 48 89 43 0c    mov %rax,0xc(%rbx) 
    400096: b0 0b     mov $0xb,%al 
    400098: 48 8d 4b 08    lea 0x8(%rbx),%rcx 
    40009c: 48 8d 53 0c    lea 0xc(%rbx),%rdx 
    4000a0: cd 80     int $0x80 

00000000004000a2 <ender>: 
    4000a2: e8 e0 ff ff ff   callq 400087 <starter> 
    4000a7: 2f      (bad) 
    4000a8: 62      (bad) 
    4000a9: 69      .byte 0x69 
    4000aa: 6e      outsb %ds:(%rsi),(%dx) 
    4000ab: 2f      (bad) 
    4000ac: 73 68     jae 400116 <ender+0x74> 

(나쁜) : 나는 objdump를 -D my_prog을 사용하면 출력이 ...

분해 섹션는 .text이다 이는 seg 오류를 일으키는 것입니다. 나는 mem에 할당되지 않은 mem 접근을 원하기 때문에 이것이 일어나고 있음을 안다. 나는 내가해야 할 일을 정말로 모르겠다. 저는 리눅스를 사용하고 있습니다.

도움 주셔서 감사합니다.

+0

왜 텍스트 섹션에 문자열을 넣었습니까? –

+0

자습서를 진행하면서 코드를 붙여 넣습니다. 그것은 문제가 될 수 있습니다. –

답변

2

메모리의 코드 (. 텍스트) 영역에 데이터를 쓰려고 시도하기 때문에 오류가 발생합니다. 실행 가능 코드 영역은 거의 항상 읽기 전용으로 표시됩니다.

다음은 몇 가지 의견이 추가 된 코드입니다.

.section .data 
.section .text 
.globl _start 

_start: 
    xor %rax, %rax 
    mov $70, %al 
    xor %rbx, %rbx 
    xor %rcx, %rcx 
    ; call sys_setreuid(0,0) 
    int $0x80 

    jmp ender 

starter: 
    ; take the return address off the stack 
    ; rbx will point to the /bin/sh string after the call instruction 
    pop %rbx 
    ; zero rax 
    xor %rax, %rax 
    ; save a zero byte to the end of the /bin/sh string (it's 7 characters long)... 
    ; (it will segfault here because you're writing to a read-only area) 
    mov %al, 0x07(%rbx) 
    ; ...followed by a pointer to the string... 
    mov %rbx, 0x08(%rbx) 
    ; ...followed by another zero value 
    mov %rax, 0x0c(%rbx) 
    ; setup the parameters for a sys_execve call 
    mov $11, %al 
    lea 0x08(%rbx), %rcx 
    lea 0x0c(%rbx), %rdx 
    int $0x80 

    ; what happens when int 0x80 returns? 
    ; you should do something here or starter will be called again 

ender: 
    call starter 
    .string "/bin/sh" 

코드에 다른 문제가 있습니다. 고려 :

mov %rbx, 0x08(%rbx) 
mov %rax, 0x0c(%rbx) 

%의 RBX은 8 바이트 값이지만, 코드는 단지 그것을 공간의 4 바이트 가치 제공 (0x0c-을 0x08 = 4). 작동 시키려면 문자열을 .data 영역으로 옮기고 (일부 추가 공간이있는 경우) 코드를 변경하여 64 비트 친화적으로 만들어야합니다.

+0

고마워, 나는 PC 용 어셈블리가 상당히 새롭다. 이것은 도움이됩니다. –

관련 문제