2017-11-22 2 views
0

버퍼 오버플로를 사용하여 함수의 반환 주소를 재정의해야합니다.버퍼 오버플로, 함수 호출

자체는 다음과 같습니다 기능 (내가 이름 인수를 전달하고) :

void vuln(char *name) 
{ 
    int n = 20; 
    char buf[1024]; 
    int f[n]; 
    int i; 
    for (i=0; i<n; i++) { 
     f[i] = fib(i); 
    } 
    strcpy(buf, name); 
    ... 
} 

나는 함수의 주소

0x080485ae <+0>: push %ebp 
    0x080485af <+1>: mov %esp,%ebp 
    0x080485b1 <+3>: push %ebx 
    0x080485b2 <+4>: sub $0x414,%esp 
    0x080485b8 <+10>: mov %esp,%eax 
    0x080485ba <+12>: mov %eax,%ebx 
    0x080485bc <+14>: movl $0x14,-0x10(%ebp) 
    0x080485c3 <+21>: mov -0x10(%ebp),%eax 
    0x080485c6 <+24>: lea -0x1(%eax),%edx 
    0x080485c9 <+27>: mov %edx,-0x14(%ebp) 
    0x080485cc <+30>: shl $0x2,%eax 
    0x080485cf <+33>: lea 0x3(%eax),%edx 
    0x080485d2 <+36>: mov $0x10,%eax 
    0x080485d7 <+41>: sub $0x1,%eax 
    0x080485da <+44>: add %edx,%eax 
    0x080485dc <+46>: mov $0x10,%ecx 
    0x080485e1 <+51>: mov $0x0,%edx 
    0x080485e6 <+56>: div %ecx 
    0x080485e8 <+58>: imul $0x10,%eax,%eax 
    0x080485eb <+61>: sub %eax,%esp 
    0x080485ed <+63>: mov %esp,%eax 
    0x080485ef <+65>: add $0x3,%eax 
    0x080485f2 <+68>: shr $0x2,%eax 
    0x080485f5 <+71>: shl $0x2,%eax 
    0x080485f8 <+74>: mov %eax,-0x18(%ebp) 
    0x080485fb <+77>: movl $0x0,-0xc(%ebp) 
    0x08048602 <+84>: jmp 0x8048621 <vuln+115> 
    0x08048604 <+86>: sub $0xc,%esp 
    0x08048607 <+89>: pushl -0xc(%ebp) 
    0x0804860a <+92>: call 0x8048560 <fib> 
    0x0804860f <+97>: add $0x10,%esp 
    0x08048612 <+100>: mov %eax,%ecx 
    0x08048614 <+102>: mov -0x18(%ebp),%eax 
    0x08048617 <+105>: mov -0xc(%ebp),%edx 
    0x0804861a <+108>: mov %ecx,(%eax,%edx,4) 
    0x0804861d <+111>: addl $0x1,-0xc(%ebp) 
    0x08048621 <+115>: mov -0xc(%ebp),%eax 
    0x08048624 <+118>: cmp -0x10(%ebp),%eax 
    0x08048627 <+121>: jl  0x8048604 <vuln+86> 
    0x08048629 <+123>: sub $0x8,%esp 
    0x0804862c <+126>: pushl 0x8(%ebp) 
    0x0804862f <+129>: lea -0x418(%ebp),%eax 
    0x08048635 <+135>: push %eax 
    0x08048636 <+136>: call 0x80483c0 <[email protected]> 
    0x0804863b <+141>: add $0x10,%esp 
    0x0804863e <+144>: sub $0x8,%esp 
    0x08048641 <+147>: lea -0x418(%ebp),%eax 
    0x08048647 <+153>: push %eax 
    0x08048648 <+154>: push $0x80487b7 
    0x0804864d <+159>: call 0x80483a0 <[email protected]> 
    0x08048652 <+164>: add $0x10,%esp 
    0x08048655 <+167>: movl $0x0,-0xc(%ebp) 
    0x0804865c <+174>: jmp 0x804867f <vuln+209> 
    0x0804865e <+176>: mov -0x18(%ebp),%eax 
    0x08048661 <+179>: mov -0xc(%ebp),%edx 
=> 0x08048664 <+182>: mov (%eax,%edx,4),%eax 
    0x08048667 <+185>: sub $0x4,%esp 
    0x0804866a <+188>: push %eax 
    0x0804866b <+189>: pushl -0xc(%ebp) 
    0x0804866e <+192>: push $0x80487c4 
    0x08048673 <+197>: call 0x80483a0 <[email protected]> 
    0x08048678 <+202>: add $0x10,%esp 
    0x0804867b <+205>: addl $0x1,-0xc(%ebp) 
    0x0804867f <+209>: cmpl $0x13,-0xc(%ebp) 
    0x08048683 <+213>: jle 0x804865e <vuln+176> 
    0x08048685 <+215>: mov %ebx,%esp 
    0x08048687 <+217>: nop 
    0x08048688 <+218>: mov -0x4(%ebp),%ebx 
    0x0804868b <+221>: leave 
    0x0804868c <+222>: ret 

을 다음 나에게주는 GDB를 사용하여 분해하고있는 vuln()의 반환과 함께 호출해야합니다 0x804850b입니다. 반송 주소가 덮어 쓰기 될 때까지 필러의 양을 어떻게 알 수 있습니까? 이름 인수는 "a"* n + "\ x0b \ x85 \ x04 \ x08"형식이어야합니다. 여기서 n은 추측하려고하는 숫자입니다. 내가 알고 있다고 생각 할수 있습니까

답변

0

...

귀하의 코드가 ... 나는 이것이 기본적인 것들이어야한다 생각하지만 초보자가 그렇게 나를 판단하지 마십시오 여전히 이니

0x080485ae <+0>: push %ebp 
0x080485af <+1>: mov %esp,%ebp 
... 
0x0804862f <+129>: lea -0x418(%ebp),%eax 
0x08048635 <+135>: push %eax 
0x08048636 <+136>: call 0x80483c0 <[email protected]> 

함수를 입력하기 전에 반환 주소는 0(%esp)입니다.

첫 번째 push 이후는 4(%esp)입니다. 다음은 %esp%ebp으로 복사되었으므로 4(%ebp)에도 있습니다.

다음으로 복사를 시작하는 위치가 -0x418(%ebp)입니다.

결론 : &buf[0]&return_address 사이의 델타는 0x418 + 4 == 0x41C입니다.

대체 솔루션 : 잘못된 주소로 name 입력을 입력 : 0x01010101, 0x01010102, ... 0x010102FF가. 코드를 실행하면 이 어떤 주소에서 충돌했는지 관찰합니다.

내 계산이 정확하다면 vuln0x41C/4 == 0x107 인 "슬롯"으로 돌아 가려고 시도 할 때 오류가 발생합니다. 여기에는 0x01010208이 포함되어야합니다.

+0

귀하는 틀림없이 정확합니다. 이제 vuln()의 반환 주소는 호출해야하는 함수의 주소이지만 원하는 함수를 입력하기 전에 세그먼트 오류가 발생합니다. 나는 나머지를 파악하려고 노력할 것이다 :) 좋은 exaplanation을위한 많은 감사. –

+0

@KristiyanTsvetanov 제 "대안 솔루션"에 결함이있었습니다 ('0x00'이 포함되어'strcpy'를 멈출 것입니다). 나는 그것을 고쳤다. –