使用gcc为32位体系结构编译的C程序的意外退出代码

使用gcc为32位体系结构编译的C程序的意外退出代码,gcc,x86,executable,reverse-engineering,Gcc,X86,Executable,Reverse Engineering,我编写了一个简单的C程序,并将其编译为32位体系结构 但当我运行它时,我发现了意想不到的结果 #包括 int foo(int n){ 整数和=0; int i; 如果(n=0x1000) 返回n; 对于(i=0;i 0x8048492:ret 0x8048493:xchg ax,ax gdb peda$p/d$eax $1 = 20100 gdb peda$c [下级1(流程32172)退出,代码0204] 警告:未运行或目标是远程的 gdb peda美元p/d 0204 $2 = 132 我

我编写了一个简单的C程序,并将其编译为32位体系结构

但当我运行它时,我发现了意想不到的结果

#包括
int foo(int n){
整数和=0;
int i;
如果(n=0x1000)
返回n;
对于(i=0;i 0x8048492:ret
0x8048493:xchg ax,ax
gdb peda$p/d$eax
$1 = 20100
gdb peda$c
[下级1(流程32172)退出,代码0204]
警告:未运行或目标是远程的
gdb peda美元p/d 0204
$2 = 132
我甚至验证了当控制权被转移回
\uu libc\u start\u main
并且调用
exit
函数时,
20100
被作为参数推送到
exit()

gdb peda$r
主回路返回20100
主()中的断点1,0x08048492
gdb peda$完成
=>0xf7e1ca83:mov DWORD PTR[esp],eax
0xf7e1ca86:调用0xf7e361e0
0xf7e1ca8b:xor ecx,ecx
gdb peda$si
=>0xf7e1ca86:调用0xf7e361e0
0xf7e1ca8b:xor ecx,ecx
gdb peda$x/wd$esp
0xffffd5c0:20100
这可能是什么原因


我认为这里的退出代码
132
SIGILL
没有任何关系,因为当我将硬编码参数更改为
foo()时
200
2
,退出代码更改为
172
,其中预期的退出代码为
26796

20100
十进制为
4E84
十六进制。
132
decimal是
84
hex.

您的shell接收到的返回值只有8位。

看起来您所做的操作无效,因为您只有8位返回到操作系统

假设您正在链接到
libc

当程序退出时,它可以使用退出状态向父进程返回有关终止原因的少量信息。这是一个介于0和255之间的值,退出进程将其作为退出参数传递

如其文件所示。与此相关的还有:

警告:不要尝试使用错误数作为退出状态。这实际上不是很有用;父进程通常不关心发生了多少错误。更糟糕的是,它不起作用,因为状态值被截断为8位。因此,如果程序尝试报告256个错误,父进程将收到0的报告错误就是成功


当您的程序可能返回20100时,系统只获取最低字节,例如
return%256


因此
20100%256=132

还要注意,标准C只支持0(与
EXIT\u SUCCESS
同义)和
EXIT\u FAILURE
作为
main
的返回值。退出代码只有8位的原因是,您从
waitpid
获得的
状态中的其他位用于其他信息:低8位是否为有效的退出状态,或者是否正在进行其他操作。是什么信号导致它退出我还挂了一些其他的旗帜。