首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

反汇编的gcc输出似乎执行"调用0"而不是"调用函数偏移",但工作正常

反汇编是将机器码转换为可读的汇编代码的过程。gcc是一种常用的编译器,它可以将高级语言代码编译成机器码。在反汇编过程中,我们可以通过查看反汇编输出来了解程序的执行流程和细节。

根据您的描述,反汇编的gcc输出似乎执行了"调用0"而不是"调用函数偏移",但程序工作正常。这可能是由于以下原因之一:

  1. 优化器的作用:gcc编译器在优化代码时,可能会对函数调用进行优化,例如将函数调用转换为直接调用函数的地址。这样可以减少函数调用的开销,提高程序的执行效率。
  2. 内联函数:如果函数被声明为内联函数,gcc编译器会将函数的代码插入到调用处,而不是生成函数调用指令。这样可以减少函数调用的开销,但会增加代码的体积。

无论是优化器的作用还是内联函数的使用,都是为了提高程序的性能和效率。虽然反汇编输出显示了"调用0",但实际上程序正常工作,这是因为编译器在生成机器码时已经进行了相应的优化。

在云计算领域中,gcc编译器常用于将应用程序编译为可在云服务器上运行的机器码。腾讯云提供了云服务器CVM产品,您可以使用gcc编译器将应用程序部署到腾讯云服务器上。您可以通过腾讯云官方网站了解更多关于云服务器CVM的信息:腾讯云云服务器CVM

同时,腾讯云还提供了丰富的云计算相关产品和服务,例如云函数SCF、容器服务TKE、云原生数据库TDSQL、云数据库CDB等。您可以根据具体需求选择适合的产品和服务来构建和部署云计算应用。更多关于腾讯云产品和服务的信息,您可以访问腾讯云官方网站进行了解和查询。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

逆向分析Spotify.app并hook其功能获取数据

PLT或过程链接表允许你代码引用外部函数(想想libc)不知道该函数在内存中位置,你只需引用PLT中一个条目。链接器在运行时为PLT中每个函数或符号执行“重定位”。...这种方法一个好处是,如果外部函数在不同地址加载,则只需要更改PLT中重定位,不是每次对代码中该函数引用。...因此,当我们为printf创建一个interpose hook时,每当我们hooking进程调用printf时,我们将调用printf实现不是libc(我们自定义库通常也会调用标准实现)。...Spotify打开正常Apple系统完整性保护(SIP)没有让我们加载未签名库:(。...在IDA中,调用r12指令地址为0x10006E234。然后我们可以将偏移量添加到该地址,并相应地设置一个断点,b -a 0x10718f234,然后继续。

1.4K30

VC和GCC内成员函数指针实现研究(一)

*ptr)(); return 0; } 先不展示这段代码输出结果。这里面只有一层继承,分别有虚函数和非虚函数。并且都有指针赋值和执行操作。不出所料是,(b....好吧运行结果还是有必要贴一下 图片 图四: VC单继承测试代码执行结果 GCC单继承成员函数指针实现 接下来就是GCC了。GCC是怎么实现呢?同样还是祭出大杀器,反汇编。...第一个值对**虚函数而言,给了*17(0x11h)*这个值,非虚函数直接上了函数地址。 从这里看,非虚函数它会怎么操作显而意见了,但是它不像VC那样多一层vcall跳转,他是怎么判断是不是函数呢?...往下看函数调用: 图片 图六:GCC单继承下成员函数指针调用 可以看到,GCC成员函数指针和VC设计明显不同。...所以和VC不同是,VCvcall是长跳转,gcc这种写法是短跳转。按个人理解,GCC方式更利于CPU指令流水线指令缓存。

52920
  • VC和GCC内成员函数指针实现研究(一)

    *ptr)(); return 0; } 先不展示这段代码输出结果。这里面只有一层继承,分别有虚函数和非虚函数。并且都有指针赋值和执行操作。不出所料是,(b....由此来保证调用是子类里成员函数。 好吧运行结果还是有必要贴一下 image.png 图四: VC单继承测试代码执行结果 GCC单继承成员函数指针实现 接下来就是GCC了。...GCC是怎么实现呢?同样还是祭出大杀器,反汇编。...往下看函数调用: image.png 图六:GCC单继承下成员函数指针调用 可以看到,GCC成员函数指针和VC设计明显不同。...所以和VC不同是,VCvcall是长跳转,gcc这种写法是短跳转。按个人理解,GCC方式更利于CPU指令流水线指令缓存。

    84830

    go语言调度器源代码情景分析之七:函数调用过程

    返回值是如何从被调用函数返回给调用函数执行完成之后又需要做哪些清理工作?...%d\n", n); //在屏幕输出 n 值 return 0; } 用gcc编译这个程序得到可执行程序call,然后使用gdb调试。...这里需要说明一点,gdb反汇编输出结果中指令地址和偏移只是gdb为了让我们更容易阅读代码附加上去,保存在内存中以及被CPU执行代码只有上图指令部分。...,最后一个参数最先入栈,第一个参数最后入栈,参数在调用栈帧之中,被调用函数通过rsp加一定偏移量来获取参数; call指令负责把执行call指令时rip寄存器(函数返回地址)入栈; gcc通过rbp...加偏移方式来访问局部和临时变量,go编译器则使用rsp寄存器加偏移方式来访问它们; ret指令负责把call指令入栈返回地址出栈给rip,从而实现从被调用函数返回到调用函数继续执行gcc

    1.3K30

    linux内核启动流程分析 - efi_stub_entry

    有了这种约定之后,大家就可以各自写各自逻辑,且在最终链接到一起时,还是可以正常执行。...我们继续看efi_stub_entry中第三行代码,它是通过call指令,调用efi_main函数执行efi_main里逻辑。...为什么这样相加就是startup_64运行时地址呢? 首先第五行代码中使用startup_64是编译时(构建时)地址,不是运行时地址。 这个可以通过下述方法确认。...首先看下startup_64函数声明: ? 上图中 .org 0x200 是说,startup_64函数编译后地址要求是0x200。 这个可以反汇编确认: ?...看上面选中行,确实是0x200。 我们再来看下efi_stub_entry中使用到startup_64那行代码反汇编: ?

    2.4K20

    linux后台开发常用调试工具

    -f 同时显示函数名称 -s 仅显示文件基本名,不是完整路径 -i 展开内联函数 -j 读取相对于指定节偏移不是绝对地址...调用所产生子进程 -o ,将strace输出定向到file中。...),gcc在你应用程序每个函数中都加入了一个名为mcount(or“_mcount”, or“__mcount”)函数,也就是说-pg编译应用程序里每一个函数都会调用mcount, mcount...使用步骤: 1、使用 -pg 编译和链接应用程序 gcc -pg -o exec exec.c 如果需要库函数调用情况: gcc -lc_p -gp -o exec exec.c 2、执行应用程序使之生成供...我们添加9-12行mtrace调用。 2、编译gcc -g -DDEBUG -o test1 test1.c 3、执行./test1,在目录里会发现./memleak.log。

    3.8K151

    【CSAPP】AttackLab

    在文件ctarget中,有一个函数touch1代码,具有以下C表示: ​​​ 任务是让CTARGET在getbuf执行其return语句时执行touch1代码,不是返回测试。...2.2.1.1 解决思路 在输入了字符串后,需要经过touch1 函数部分(不是执行test返回语句),即缓冲区需要溢出,如果缓冲区不溢出,则在运行test函数后就结束了,不会经过touch1 touch1...在文件ctarget中,存在用于具有以下C表示函数touch2代码: ​​​ 任务是让CTARGET执行touch2代码,不是返回测试,且输入字符串要与Cookie文件中字符串相匹配。...在文件ctarget中,有用于函数hexmatch和touch3代码,具有以下C表示: ​​​ 任务是让CTARGET执行touch3代码,不是返回测试。...•将保存堆栈内存部分标记为不可执行,因此即使将程序计数器设置为注入代码开头,程序也会因分段错误失败。 通过执行现有代码,不是注入新代码,在程序中完成有用事情。

    24410

    arm平台根据栈进行backtrace方法

    死机问题常见定位手段如下: 根据打印/日志信息梳理业务逻辑,排查代码; 设备死机时候输出函数调用栈(backtrace),结合符号文件表/反汇编文件定位问题; 输出死机时内存镜像(coredump)...二、 backtrace 做backtrace最方便就是使用gcc自带backtrace功能,编译时候加上-funwind-tables选项(该选项对性能无影响但是会使可执行文件略微变大),异常处理函数调用相关函数即可输出函数调用栈...又由于LR是指向调用函数(即PC寄存器历史值,通过addr2line工具或者把可执行文件反汇编,可以看到func1中LR落在main函数中,并且指向调用func1下一条语句)。...可以看到问题出现时PC寄存器取值为0xa02f8524, SP寄存器值为0xa84f26d8。通过反汇编代码可以看到,PC指针落在函数func3内部。...本栈帧中lr位置应该在0xa84f26e4(func3栈帧中lr位置)基础上向上偏移24个字节,也就是0xa84f26fc,从栈信息中可以看到这里数值是0xa02f8a70, 指向函数func2

    5.7K20

    如何进行Linux平台共享库替换

    参数决定了该函数调用功能。...被替换函数特征分析 测试被替换函数hello()存在于SOlibfso.so中,由主程序main载入并以固定周期循环调用,其反汇编代码如图2所示。...图 2测试被替换函数反汇编代码 替换函数编译再构造 测试替换函数汇编代码如图3所示,功能为输出Hello World!字符,其中方框标识空指令是为堆栈恢复和函数返回指令预留存储空间。...因此对被替换函数所在SO进行反汇编分析,可以确定被替换函数替换位置首地址,再配合linux提供进程虚拟地址空间查看命令得到SO加载基地址,简单相减即可得到被替换函数位置相对偏移地址。...执行结果 执行动态替换程序,被替换程序输出由Hello Myboy! 变成 Hello world! 且继续正常运行,说明替换已成功。

    2.9K80

    【技术创作101训练营】CTF-PWN方向入门

    我们看下面这个图示,上面演示正常情况,那如果我们调用函数正好是往栈空间里面读入文本呐?如果它没有对输入长度进行限制是不是我们可以覆盖掉返回地址。...使用cyclic 200生成200个有规律字符,然后再gdb调试时候输入进去,因为超出了缓冲区长度而且不是正常地址程序会报错,我们用得到地址再次使用cyclic算一下偏移是多少。...算出偏移然后只要找到后门函数地址就可以啦 我们可以使用objdump -d level1来查看反汇编代码,找到后门函数地址(也可以用IDA查看)。...,此时CPU就会抛出异常,不是执行恶意指令。...write函数偏移得到libc基址,这样用libc基址加上其他函数偏移就能找到其他函数了。

    1.5K21

    Vdex Extractor:从Vdex文件反编译和提取Android Dex字节码

    vdexExtractor工具集成了一个Vdex依赖项walker函数,该函数能够迭代所有依赖项信息并以人类可读格式转储它们。以下代码段演示了示例Vdex文件依赖项转储示例。 ? ?...集成反汇编程序 为了调试反编译器并协助Dex字节码调查任务,实现了一个轻型反汇编程序。反汇编输出非常类似于platform/art项目的AOSP dexdump2实用程序提供输出。...反汇编程序可以独立于unquickening反编译器使用。以下代码段中说明了示例输出。前缀行[new]说明了位于该偏移量中反编译指令(前一行)输出。...现在由于Vdex容器存储是Cdex文件不是标准Dex,因此vdexExtractor后端(从版本019开始)已经更新并支持它们。...ArDC4mvMyPrRhFG5WH_zNz0jNarZ 静态编译:不支持 二进制名称中's'后缀代表“静态编译”,“d”代表“debug”构建。

    5.1K72

    Rop-Ret2Text介绍及实例教学

    ROP也有其不同于正常程序内在特征: (1)ROP控制流中,call和ret指令不操纵函数,而是用于将函数里面的短指令序列执行流串起来,但在正常程序中,call和ret分别代表函数开始和结束;...(2)ROP控制流中,jmp指令在不同函数甚至不同库之间跳转,攻击者抽取指令序列可能取自任意一个二进制文件任意一个位置,这很不同于正常程序执行。...比如,函数中部提取出jmp短指令序列,可将控制流转向其他函数内部;正常程序执行时候,jmp指令通常在同一函数内部跳转。...,就是看反汇编找找数组定义位置 我们要要注意是 gets(buf)、strcpy(dest,sec)、scanf("%s",buf)、stract(buf,buf2)、read(0,buf,size...每个用户都有“home”目录,也就是用户个人目录,比如用户“home”目录就是/root,普通用户ahome目录就是/home/a,之后我们可以看到 本次实验编译指令 gcc -no-pie

    23610

    地址无关码

    Linux和GCC支持这种装载时重定位方法,我们前面在产生共享对象时,使用了两个GCC参数“shared”和“-fPIC”,如果只使用“- shared”,那么输出共享对象就是使用装载时重定位方法...然后我们根据变量地址在GOT中偏移就可以得到变量地址,当然GOT中每个地址对应于哪个变量是由编译器决定比如第一个地址对应变量b,第二个对应变量c等。 让我们再回顾刚才函数bar(反汇编代码。...由于可执行文件在运行时并不进行代码重定位,所以变量地址必须在链接过程中确定下来。为了能够使得链接过程正常进行,链接器会在创建可执行文件时,在它“bss”段创建一个 global变量副本。...正如我们前面分析过一样,如果代码不是地址无关,它就不能被多个进程之间共享,于是也就失去了节省内存优点。...,那么GCC会使用PC方法来产生可执行文件代码段部分,以便于不同进程能够共享代码段,节省内存。

    1K20

    ELF文件及android hook原理

    主要分下面几种情况: 如果符号不是”COMMON”类型(即st_shndx不为SHN_COMMON),则st_value表示该符号在段中偏移,即符号所对应函数或变量位于由st_shndx指定段,...0xE8是一条近址相对位移调用指令,后面4个字节就是被调用函数相对于调用指令下一条指令偏移量。...---- 可执行文件装载与进程 程序执行时所需要指令和数据必需在内存中才能够正常运行。...程序开始执行时,动态链接器都要进行一次链接工作,会寻找并装载所需共享对象,然后进行符号查找地址重定位等工作,如此一来,程序运行速度必定会减慢。...GOT 保存了程序中所要调用函数地址,运行一开时其表项为空,数组大小在编译时已经确定了,运行时会实时更新表项。相当于链接器给动态加载器布置了填空题作业。

    3.9K81

    基础理论

    常用汇编指令 mov pop 弹栈 add/sub 加减 push 压栈 lea 取地址 call 调用函数 2、栈帧 从下向上,大地址到小地址 栈帧就是一个函数执行环境 函数参数...或者是 gcc hello.c -0 hello gcc -Wall -g -o hello hello.c 注意: -Wall 代表编译器在编译过程中会输出警告信息(Warning),比如有些变量你并没有使用...如果你不是百分之百确定你程序毫无问题,建议加上 -g 参数。这样 debug 时候会方便很多。 -o 代表编译器会将编译完成后执行文件以你指定名称输出到你指定文件夹下。...-o 空格后名称就是输出文件名称。例如我这里 -o 后是 test,就是说 gcc 会在编译成功后在我的当前目录下生成一个叫 test 执行文件。...-m32:编译32位程序 接下来我们就可以使用gdb进行调试了 首先我们先来看看主函数main反汇编代码 disass main 我们再来看看test函数 disass test 接下来,我们要分析传参情况

    11910

    通过反汇编理解函数调用机制(x86和ARM)

    , b = 2; 10 int result; 11 result = add(a, b); 12 printf("%d",result); 13 } 执行反汇编指令...对上面汇编代码分析: 进入main函数,保护现场,将rbp压入堆栈; 然后为main函数开拓新堆栈框架,rbp与当前rsp相同,rsp再向上扩充16个字节(0x10);(以前C程序只能在函数前面声明变量...,是因为编译器还么有那么“智能”,它只能通过分析前部分变量,一次性为程序扩充堆栈) 然后向栈底上方偏移地址为8和12单元存入数据1和2; 把数据送入通用寄存器中,以供新函数调用; 跳转到add...eax; pop出rbp,回到main函数; 将eax中运算结果赋给栈底上方偏移地址为4单元; 然后调用printf函数显示结果。...使用arm-linux-gcc编译并反汇编:arm-linux-objdump -D -m arm a.out 得到arm机器汇编代码(除去一些初始化代码)如下: ? ?

    2K20

    Canary保护机制及绕过

    可能存在坑 记住头文件引用,由于使用read等系统调用函数,所以要进入 Unix标准库unistd.h。...函数偏移之间关系,这样在装在后既可以通过基地址与偏移差值找到backdoor函数地址。...objdmp -d pwn_1 -M intel -d 反汇编pwn_1中需要执行指令那些section -M 因特尔风格显示汇编代码,这样更贴近我们常见汇编风格 启动!...由于接下来实验截图不是来自一次完整流程,而是反复执行是更加详细显示整个流程,所以可能存在前后地址/值不一样情况。...获取到随机canary值 由于我们源程序会以字符串形式输出们输入内容,如前面所说 C 字符串是以'\0'结尾,所以我们只要构造第一个read数据长度为10 + 1即可覆盖最后'\0',

    82910

    含大量图文解析及例程 | Linux下ELF文件、链接、加载与库(上)

    不是所有以上三种ELF形式都有这两张表, 如果用于编译和链接(可重定位目标文件),则编译器和链接器将把elf文件看作是节头表描述集合,程序头表可选。...clean:  rm -f *.o a.out 结果生成执行文件可以正常输出我们想要内容。...我们不妨用objdump反汇编来验证我们想法: objdump -d a.out 输出(节选): 我们看到,foo函数在代码段前四个字节地址确是就是我们上面打印输出c3 37 04 8d(注意字节序为小端法...我们看到,在编译还未链接main.o文件中,对于引用外界符号部分是用留空方式用0暂时填充。即上图中红框框出来位置。...注意图中最后一列是笔者添加注释,指明了本行中留空地方对应那个外部符号。 另外注意这里%rip相对寻址偏移量都是0,一会儿我们会讲到,在静态链接完成之后,它们偏移量会被填上正确数值。

    3.4K52

    第48章 MDK编译过程及文件类型全解(1)

    图 488 打开命令行 (4)    在弹出命令行窗口中输入"fromelf"回车,若窗口打印出formelf帮助说明,那么路径正常,就可以开始后面的工作了;若提示"不是内部名外部命令,也不是可运行程序...根据这几个文件记录类型,可以知道uvprojx文件是最重要,删掉它我们就无法再正常打开工程了,uvoptx及uvguix文件并不是必须,可以删除,重新使用MDK打开uvprojx工程文件后,会以默认参数重新创建...MDK可重定位文件*.o不包含这部分内容,因为它还不是执行文件,armlink输出*.axf文件就包含该内容了。...,表中包含了地址偏移、相应地址中内容以及根据内容反汇编得到指令。..."__scatterload "代码会被"__main"函数调用,见代码清单 488,__main在启动文件中"Reset_Handler"会被调用,因而,在主体程序执行前,已经完成了分散加载过程

    1.6K10

    网络安全自学篇(五)| IDA Pro反汇编工具初识及逆向工程解密实战

    IDA反汇编包括两个阶段,首先将程序代码和数据分开,分别标记函数并分析参数调用、跳转、指令关系等;接着如果IDA能识别文件编译类型,就装载对应编译器特征文件,给各函数赋名。...第八步:关闭IDA Pro并保存数据库文件 保存IDB数据库文件至本地,它记录了用IDA Pro对该程序分析中工作状态,包括反汇编分析、区段扫描、用户自定义结构、用户自定义名称、注释等信息。...程序调用所有函数窗口 Open strings window 打开字符串显示窗口 这里作者点击Strings显示程序中所有字符串,该窗口有助于你通过程序运行输出逆向找出对应代码片断,如下图字符串及对应...Open names window 函数和参数命名列表 Open functions window 程序调用所有函数窗口 Open strings window 打开字符串显示窗口 ?...这段代码基本逻辑是输入字符串Str,然后循环与gcc2_compiled_变量异或加密,输出为Str1变量,当加密后Str1变量值为“123456789”则解密成功,否则失败。

    8K21
    领券