# 背景提要

回校后来到实验室 借用了下姚佬的 2k 大屏 发现确实舒服 但是有个致命的问题 键盘输入和显示器显示有明显的延迟
但是在主机就没事
加上之前也厌烦了在主机和虚拟机之间划来划去 怪麻烦的
就想有没有可替代的方案 让我不需要进虚拟机(将其当个远程服务器)
就能舒舒服服的做 pwn 题

然后发现了 Csome 师傅的博客 是用 powershell 在 wsl 进行的
然后我审计了一下 pwntools 的源码
确实会启动一个 terminal 进程 将我们输入的参数进去执行
在 window 下启动的进程是 cmd.exe 是挂载在 /mnt 目录下
但是由于是跨文件系统 打开实在太慢 (window 的程序要访问 linux 进程内部的内存空间 得先从 Linux 切进 window
在 window 上打开 cmd.exe 再切回 Linux)

因此寻找别的替代方案
正好也是 defcon 时期 无聊刷推的时候看到 DEF CON LiveCTF 2022 - Day 2 - YouTube
中间的 winpwn 玩家采取的方法
其实也就是 pause 等待进程 attach 罢了 不过这个足以解决我的一切问题

# pwn 脚本中定义个函数

举例 这里定义了一个 dbg 函数 可以将我们传入的断点和 set 信息统统写入 /tmp/gdbscript 作为 gdb 启动信息
(pwntools 内部就是这么实现的 依葫芦画瓢
dft 是预定义的一些信息 比如 set $a=0xdeedbeaf 这些需要每次都写入的就写到 dft 里面去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from pwn import *
context(os="Linux",arch="amd64",log_level="debug")
p = process("./emulator", env={"LD_PRELOAD": "./libunicorn.so.1"})

se = lambda data :p.send(data)
sa = lambda delim,data :p.sendafter(delim, data)
sl = lambda data :p.sendline(data)
sla = lambda delim,data :p.sendlineafter(delim, data)
sea = lambda delim,data :p.sendafter(delim, data)
rc = lambda numb=4096 :p.recv(numb)
rl = lambda :p.recvline()
ru = lambda delims :p.recvuntil(delims)
uu32 = lambda data :u32(data.ljust(4, b'\x00'))
uu64 = lambda data :u64(data.ljust(8, b'\x00'))
info = lambda tag, addr :p.info('======>'+tag + ': {:#x}'.format(addr))
ir = lambda :p.interactive()
sc = lambda s, addr :success(s + " => " + hex(addr))
ps = lambda :pause()

dft = ["b *0x1234", "b *0x7890000"]
def dbg(s=[""]):
a = dft + s
f = open("/tmp/gdbscript", "w")
a = list(map(lambda x:x + '\n', a))
f.writelines(a)
f.close()
ps()

def exp():
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
dbg(["b *0xdeedbeaf"])

if __name__ == "__main__":
exp()
ir()

# gdb 的启动方式

执行 py 脚本 pause 挂起后
由我们的 powershell 去 attach

1
gdb attach $(pidof procname) -x /tmp/gdbscript

procname 是程序名

或者更直接点 写个脚本 pgdb

1
2
3
4
5
6
7
8
#!/bin/sh
#gdb attach $(pidof procname) -x /tmp/gdbscript
if [ $# -ne 1 ];then
echo "usage : pgdb procname"
exit 1
fi
pid=`pidof $1`
gdb attach $pid -x /tmp/gdbscript

只需要 pgdb procname 就能 attach 了

# 工作流

vscode 写 exp
vscode terminal 进行 exp 的执行(最喜欢的 terminal
powershell 进行 gdb
Pasted image 20220816164008