使用gcc为32位体系结构编译的C程序的意外退出代码
我编写了一个简单的C程序,并将其编译为32位体系结构 但当我运行它时,我发现了意想不到的结果使用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 我
#包括
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位是否为有效的退出状态,或者是否正在进行其他操作。是什么信号导致它退出我还挂了一些其他的旗帜。