Написах проста C програма и я компилирах за 32-битова архитектура.
Но когато го пуснах, открих неочаквани резултати.
#include <stdio.h>
int foo(int n) {
int sum=0;
int i;
if (n <= 1 || n >= 0x1000)
return n;
for (i=0; i<= n; i++) {
sum = sum + i;
}
return foo(sum);
}
int main(int argc, char** argv) {
int n;
n = foo(200);
printf("\n\n main about to return %d \n\n", n);
return n;
}
➜ wbench gcc -o test.elf test.c -m32 -fno-stack-protector -mpreferred-stack-boundary=2 -Wall
➜ wbench ./test.elf
main about to return 20100
➜ wbench echo $?
132
Очаквам 20100
да бъде върнатата стойност, както се отпечатва от основната функция.
Но получавам 132
като изходен код.
Проверих с помощта на GDB, че 20100
е стойността в регистъра eax
, когато main е на път да се върне.
➜ wbench gdb -q test.elf
gdb-peda$ b *main+44
Breakpoint 1 at 0x8048492
gdb-peda$ r
main about to return 20100
Breakpoint 1, 0x08048492 in main ()
0x8048489 <main+35>: call 0x80482f0 <printf@plt>
0x804848e <main+40>: mov eax,DWORD PTR [ebp-0x4]
0x8048491 <main+43>: leave
=> 0x8048492 <main+44>: ret
0x8048493: xchg ax,ax
gdb-peda$ p/d $eax
$1 = 20100
gdb-peda$ c
[Inferior 1 (process 32172) exited with code 0204]
Warning: not running or target is remote
gdb-peda$ p/d 0204
$2 = 132
Дори проверих, че когато контролът се прехвърля обратно към __libc_start_main
и се извиква функция exit
, 20100
се насочва като аргумент към exit()
.
gdb-peda$ r
main returning 20100
Breakpoint 1, 0x08048492 in main ()
gdb-peda$ finish
=> 0xf7e1ca83 <__libc_start_main+243>: mov DWORD PTR [esp],eax
0xf7e1ca86 <__libc_start_main+246>: call 0xf7e361e0 <exit>
0xf7e1ca8b <__libc_start_main+251>: xor ecx,ecx
gdb-peda$ si
=> 0xf7e1ca86 <__libc_start_main+246>: call 0xf7e361e0 <exit>
0xf7e1ca8b <__libc_start_main+251>: xor ecx,ecx
gdb-peda$ x/wd $esp
0xffffd5c0: 20100
Каква може да е причината за това?
Не мисля, че кодът за изход 132
тук има нещо общо с SIGILL
, защото когато промених твърдо кодирания аргумент на foo()
от 200
на 2
, кодът за изход се промени на 172
, където очакваният код за изход е 26796
.
EXIT_SUCCESS
) иEXIT_FAILURE
като връщани стойности отmain
. - person jxh   schedule 04.08.2015