Переполнение стека eip x86 против простого кода C x86_64

Позвольте мне пропустить введение и перейти к хорошему. Я читаю «Справочник этичного хакера» и пробую пример кода (около p175).

----------------------------------------------- ------------------------------------------

Цель: переполнить EIP в стеке

Пример кода:

##> cat overflow.c
main(){
    char str1[10];   // declare a 10byte string
    // next, copy 35 bytes of 'A' to 'str1'
    strcpy(str1,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
}

-------------------------------------- -------------------------------------------------- -

Если я скомпилирую и запущу его на своем ноутбуке x86, результат будет таким, как ожидалось.

результат на X86 с openSuse 12.1

##> uname -a
Linux linux-tzxm.site 3.1.0-1.2-desktop #1 SMP PREEMPT 
Thu Nov 3 14:45:45 UTC 2011 (187dde0) i686 i686 i386 GNU/Linux

##> cat /proc/sys/kernel/randomize_va_space 
1

##> gcc version 4.6.2 (SUSE Linux)
##> GNU gdb (GDB) SUSE (7.3-41.1.2)

##> gdb -q overflow

Reading symbols from /home/administrator/Programming/C/testProgs/overflow...done.

(gdb) run

Starting program: /home/administrator/Programming/C/testProgs/overflow 

Program received signal SIGSEGV, Segmentation fault.

0x41414141 in ?? ()

(gdb) info reg eip

eip            0x41414141       0x41414141

-------------------------------------- -------------------------------------------------- -

Однако, если я сделаю то же самое на своем ноутбуке x86_64, то результат будет другим и не таким, как ожидалось (с точки зрения моих небольших знаний)

результат на x86_64 с openSuse 11.3

##> uname -a
Linux linux-2mna.site 2.6.34.10-0.4-desktop #1 SMP PREEMPT 2011-10-19 22:16:41 +0200 x86_64 x86_64 x86_64 GNU/Linux

##> cat /proc/sys/kernel/randomize_va_space 
1

##> gcc version 4.5.0 20100604
##> GNU gdb (GDB) SUSE (7.1-3.12)

##> gdb -q overflow2

Reading symbols from /home/jojojorn/Documents/Personal/HACKING/C_Prog/Tests/testProgs/overflow2...done.

(gdb) run

Starting program: /home/jojojorn/Documents/Personal/HACKING/C_Prog/Tests/testProgs/overflow2 

Program received signal SIGSEGV, Segmentation fault.

0x0000000000400553 in main () at overflow.c:11
11      }

(gdb) info reg eip

Invalid register `eip'

(gdb) 

---- -------------------------------------------------- -----------------------------------

Итак, вот мои вопросы:

1) почему Я не могу переполнить EIP в моем стеке на моем x86_64? Есть ли разница в поведении стека между x86_64 и x86?

2) когда я запускаю скомпилированный двоичный файл x86 на моем x86_64 и проверяю его с помощью gdb, результат снова будет таким, как ожидалось.Итак, я предполагаю, что разница заключается в использовании 32-разрядной версии gcc и 64-разрядной версии gcc? В чем заключается разница в этом простом коде и почему?

3) Если я хочу, чтобы мой код на x86_64 вел себя так, как он был скомпилирован на x86, можно ли задать параметр gcc во время компиляции?

4 ) Я задаю этот вопрос, а это значит, что у меня еще нет необходимых знаний, чтобы задавать более точные вопросы. Есть ли что-то еще, что приходит в голову вашему гению, что я должен был бы спросить (и на что вы бы ответили)?

С уважением

10
задан mattjgalloway 8 December 2011 в 15:25
поделиться