pwn的一些技巧

37 篇文章 0 订阅
37 篇文章 3 订阅

glibc-all-in-one:使用目标主机的libc进行调试

要使用目标主机的libc,要获得目标主机的libc文件和ld文件,这里使用glibc-all-in-one
glibc-all-in-one下载:

sudo git clone https://github.com/matrix1001/glibc-all-in-one.git #也可以自行去官网下载然后解压
cd glibc-all-in-one/

glibc-all-in-one安装

sudo python3 update_list
[+] Common list has been save to "list"
[+] Old-release list has been save to "old_list"

list 查看可以安装的glibc版本
在这里插入图片描述
下载所需要的glibc版本:

sudo ./download 2.34-0ubuntu3_amd64  #这个因人而异了 看你需要哪个版本

exp脚本使用:

libc_file = "/home/kali/Desktop/pycahrm_project/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc-2.23.so"
ld_file = '/home/kali/Desktop/pycahrm_project/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/ld-2.23.so'
ENV = {"LD_PRELOAD":libc_file}
io = process([ld_file,"./babyheap_0ctf_2017"],env=ENV)

recvuntil()获取6字节地址

虽然在64位计算机中,一个地址的长度是8字节,但是实际上的计算机内存只有16G内存以下,所以一般的地址空间只是用了不到 2^48 的地址空间。因此实际的操作系统中,一个地址的最高位的两个字节是00,而且实际栈地址一般是0x7fxxxx开头的,因此为了避免获取错误的地址值,只需要获取前面的6字节值,然后通过ljust函数把最高位的两字节填充成00。 我们可以用这种一般的写法:

u64(p.recv(6).ljust(8, "\x00"))
u64(io.recvuntil('\x7f')[-6:].ljust(0x8,b'\x00'))

ROPgadget的使用

ROPgadget --binary babyrop2 --only "pop|ret"
ROPgadget --binary babyrop2 --only "pop|ret" | grep rdi

one_gadget安装和使用

one_gadget是libc中存在的一些执行execve("/bin/sh", NULL, NULL)的片段,当可以泄露libc地址,并且可以知道libc版本的时候,可以使用此方法来快速控制指令寄存器开启shell。
安装
相比于system("/bin/sh"),这种方式更加方便,不用控制RDI、RSI、RDX等参数。运用于不利构造参数的情况。

sudo apt -y install ruby
sudo gem install one_gadget

使用
在这里插入图片描述

通过已给出的libc找相关地址

# 寻找libc基址:某函数真实地址-libc函数的偏移地址
libc_base = read_addr - libc.symbols["read"]
# 通过libc找字符串地址
str_bin_sh = libc_base + next(libc.search(b'bin/sh'))

IDA快捷键

  • n:修改函数名
  • ctrl + s:查看各段地址
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值