如何在这个小程序中正确重写返回地址?

时间:2019-01-06 17:17:41

标签: c assembly x86 gdb

我正在尝试重写此程序的返回地址,因此当程序询问时,我输入:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBXXXX,其中“ XXXX”是我需要放置的地址。但是,当我用“ \ xef \ x11 \ x40 \ x00”替换“ XXXX”时,

我尝试使用命令

printf "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBB\xef\x11\x40\x00" | ./buffer

但是我看到有些符号是不可打印的并且不能正确发送。 我不认为这是因为在我的终端中启用了Unicode,因为当我输入printf "\x41"时它将返回“ A”。 我也尝试在GDB中做同样的事情,但是我只看到programm带有一个奇怪的地址(0x3961785c)。

这是一个代码:

#include <stdio.h>

void return_input()
{
    char array[30];
    gets(array);
    printf("%s\n", array);
}

int main()
{
    return_input();
    return 0;
}

破坏主线:

0x004011df <+0>:    push   %ebp
   0x004011e0 <+1>: mov    %esp,%ebp
   0x004011e2 <+3>: and    $0xfffffff0,%esp
   0x004011e5 <+6>: call   0x4011fb <__x86.get_pc_thunk.ax>
   0x004011ea <+11>:    add    $0x2e16,%eax
   0x004011ef <+16>:    call   0x4011a9 <return_input>
   0x004011f4 <+21>:    mov    $0x0,%eax
   0x004011f9 <+26>:    leave  
   0x004011fa <+27>:    ret 

烦恼return_input

   0x004011a9 <+0>: push   %ebp
   0x004011aa <+1>: mov    %esp,%ebp
   0x004011ac <+3>: push   %ebx
   0x004011ad <+4>: sub    $0x24,%esp
   0x004011b0 <+7>: call   0x4010b0 <__x86.get_pc_thunk.bx>
   0x004011b5 <+12>:    add    $0x2e4b,%ebx
   0x004011bb <+18>:    sub    $0xc,%esp
   0x004011be <+21>:    lea    -0x26(%ebp),%eax
   0x004011c1 <+24>:    push   %eax
   0x004011c2 <+25>:    call   0x401030 <gets@plt>
   0x004011c7 <+30>:    add    $0x10,%esp
   0x004011ca <+33>:    sub    $0xc,%esp
   0x004011cd <+36>:    lea    -0x26(%ebp),%eax
   0x004011d0 <+39>:    push   %eax
   0x004011d1 <+40>:    call   0x401040 <puts@plt>
   0x004011d6 <+45>:    add    $0x10,%esp
   0x004011d9 <+48>:    nop
   0x004011da <+49>:    mov    -0x4(%ebp),%ebx
   0x004011dd <+52>:    leave  
   0x004011de <+53>:    ret 

0 个答案:

没有答案